Avatar billede plaf Nybegynder
11. oktober 2005 - 13:21 Der er 9 kommentarer og
1 løsning

System.IndexOutOfRangeException:

I tabel 1 har jeg to kolonner: En kolonne med ID og En kolonne med Navn.
I tabel 2 har jeg et antal kolonner svarende til rækkerne i tabel 1.

Eksempel:

Tabel 1:
ID    Navn
-------------
1      Navn 1
2      Navn 2
3      Navn 3

Tabel 2:

1        2        3    (bemærk her er kolonnenavne ID fra tabel1)
------------------------
værdi1  værdi2  værdi3
....    ....    ....
....    ....    ....


Ønsket resultat: Tabel 3

Navn 1    Navn 2    Navn 3
-----------------------------
værdi1    værdi 2    værdi3
....      ....      ....
....      ....      ....


Det er altså egentlig data fra tabel 2, jeg vil have vist, men med kolonneoverskrifter fra tabel 1.

Efter at have klippet og klistret har jeg fået følgende:

-------------------------------------------------------


Dim oConnection As Odbc.OdbcConnection = New Odbc.OdbcConnection(Application("ConnString"))
        Dim OneCommand, TwoCommand As Odbc.OdbcCommand
        Dim OneDataReader, TwoDataReader As Odbc.OdbcDataReader
        Dim OneSQL As String = "SELECT * FROM Tabel1"
        Dim TwoSQL As String = "SELECT * From Tabel2"
        Dim OneArray(), TwoArray() As String
        Dim F1, F2 As String
        Dim T, U As Integer

        oConnection.Open()
        OneCommand = New Odbc.OdbcCommand(OneSQL, oConnection)
        OneDataReader = OneCommand.ExecuteReader
        While OneDataReader.Read()
            F1 = F1 & " " & CStr(OneDataReader("ID")) & ";,,; "
            F2 = F2 & " " & CStr(OneDataReader("Navn")) & ";,,; "
        End While
        oConnection.Close()

        OneArray = Split(F1, ";,,;")
        TwoArray = Split(F2, ";,,;")
        Dim dt As New DataTable

        For T = LBound(OneArray) To UBound(TwoArray)
            'Create the columns
            'Add the columns to the DataTable's Columns collection
            dt.Columns.Add("" & OneArray(T) & "")
        Next

        oConnection.Open()
        TwoCommand = New Odbc.OdbcCommand(TwoSQL, oConnection)
        TwoDataReader = TwoCommand.ExecuteReader
        Dim dr As DataRow
        While TwoDataReader.Read()
            dr = dt.NewRow()
            For U = LBound(OneArray) To UBound(OneArray)
                dr("" & OneArray(U) & "") = CStr(TwoDataReader("" & TwoArray(U) & ""))' HER GÅR DET STADIG GALT
            Next
            dt.Rows.Add(dr)
        End While
        oConnection.Close()

        'Bind the DataTable to the DataGrid
        dgPeople.DataSource = dt
        dgPeople.DataBind()

-------------------------
Når jeg kører det, får jeg:
System.IndexOutOfRangeException: 1 i den linie, hvor jeg også har markeret, at det går galt. Jeg VED, at der i Tabel2 findes en kolonne, der hedder 1.

Erstatter jeg det med:
dr("" & OneArray(U) & "") = "test"
,får jeg en fin tabel - dog med "test i alle celler".

Nogen, der kan se, hvor det går galt?

/Plaf
Avatar billede plaf Nybegynder
11. oktober 2005 - 14:58 #1
Gjorde sådan her:

        For U = LBound(TwoArray) To UBound(TwoArray)
                KolonneNavn = CStr(Trim(TwoArray(U)))
                Try
                    Celleindhold = TwoDataReader(KolonneNavn)
                Catch
                    Celleindhold = ""
                End Try
                dr("" & OneArray(U) & "") = Celleindhold
            Next


Og nu kører det. Jubiiii.

Det gik åbenbart galt, når cellen var tom...
/Plaf
Avatar billede arne_v Ekspert
11. oktober 2005 - 15:35 #2
ikke fordi det har nogen funktionel betydning, men du kunne overveje
at forsøge at slippe af med de ikke .NET funktioner (CStr, Split, UBound etc.)
Avatar billede plaf Nybegynder
11. oktober 2005 - 15:38 #3
Hej arne v!

Selvfølgelig vil jeg gerne gøre det så rigtig som muligt. Men i nøden tyr jeg nok til det, jeg kender til...

Hvordan ville du gøre det?

/Plaf
Avatar billede arne_v Ekspert
11. oktober 2005 - 15:40 #4
CStr(OneDataReader("ID"))

må kunne laves som

OneDataReader("ID").ToString
Avatar billede arne_v Ekspert
11. oktober 2005 - 15:43 #5
OneArray = Split(F1, ";,,;")

må kunne laves som

OneArray = F1.Split("#".ToCharArray)

hvis altså

& ";,,; "

bliver

& "#"
Avatar billede arne_v Ekspert
11. oktober 2005 - 15:44 #6
For U = LBound(OneArray) To UBound(OneArray)

må kunne laves som

For U = 0 To OneArray.Length-1
Avatar billede arne_v Ekspert
11. oktober 2005 - 15:45 #7
og ved nærmere eftertanke

skal det ikke være

For U = LBound(OneArray) To UBound(OneArray)-1

eller

For U = 0 To OneArray.Length-2

for at undgå den sidste tomme streng ?
Avatar billede plaf Nybegynder
11. oktober 2005 - 15:46 #8
Tusind tak for fiffene :-)
Avatar billede thrytter Nybegynder
11. oktober 2005 - 21:41 #9
Arne V >>
Vil nu mene at CStr er en indbygget .NET funktion (i lighed med de andre Cxxx funktioner)
Avatar billede arne_v Ekspert
11. oktober 2005 - 21:45 #10
Den er i .NET men det er jo en funktion fra procedural programmering og
den objekt orienterede måde at gøre det samme på må være at bruge .ToString
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester