Array Split Index out of Range

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Same.

    Array Split Index out of Range

    Hallo zusammen,

    ich habe Probleme mit meinem Code. Er macht genau das was er machen soll, aber trotzdem kommt es zu einer Ausnahme. Diese behauptet der Index wäre out of Range.
    Ich möchte hier eine CSV Datei lesen die aus 2 Wörtern getrennt durch Semikolon besteht. Diese will ich dann in meine Sqlite Datenbank schreiben. Wie gesagt der Code macht was er soll nur der Fehler ist da.

    VB.NET-Quellcode

    1. Dim sr As StreamReader = New StreamReader(strFile)
    2. Dim sqlcon As New SQLiteConnection()
    3. Dim sqlcom As SQLiteCommand
    4. Dim line As String
    5. Try
    6. sqlcon.ConnectionString = "DATA SOURCE=geburtstage.db3;"
    7. sqlcon.Open()
    8. sqlcom = sqlcon.CreateCommand
    9. If cbLöschen.Checked = True Then
    10. sqlcom = sqlcon.CreateCommand
    11. sqlcom.CommandText = "DELETE FROM Personen"
    12. sqlcom.ExecuteNonQuery()
    13. sqlcom.Dispose()
    14. End If
    15. Do
    16. sqlcom = sqlcon.CreateCommand
    17. line = sr.ReadLine()
    18. Dim spline() As String = Split(line, ";")
    19. sqlcom.CommandText = "INSERT INTO Personen (Name, Geburtstag) VALUES ('" & spline(0) & "','" & spline(1) & "')"
    20. sqlcom.ExecuteNonQuery()
    21. sqlcom.Dispose()
    22. Loop Until line Is Nothing
    23. sr.Close()
    24. sqlcon.Close()
    25. Catch ex As Exception
    26. MsgBox(ex.Message)
    27. End Try
    Das Splitten sollte so funktionieren, wenn denn der String auch wie gewüscht in line drinsteht. Prüf das ma in Debug.
    Anscheinend willst du nur das ";" gegen ein "," austauschen? Dann nimm doch String.Replace!
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Also die CSV Datei sind etwa so aus.

    Hans Wurst;12.04.1984 ' Also Name und Geburtstag
    Know How;25.09.1976 'Und immer so weiter

    Das Semikolon soll die Zeile an genau der Stelle trennen und danach in den Array schreiben. Demnach befindet sich der Name im Array(0) und das Geburtsdatum in Array(1) oder nicht?

    Same schrieb:

    Wie gesagt der Code macht was er soll nur der Fehler ist da.
    (Witzbold! ;))

    Aber guggemol:

    VB.NET-Quellcode

    1. Do
    2. sqlcom = sqlcon.CreateCommand
    3. line = sr.ReadLine()
    4. Dim spline() As String = Split(line, ";")
    5. sqlcom.CommandText = "INSERT INTO Personen (Name, Geburtstag) VALUES ('" & spline(0) & "','" & spline(1) & "')"
    6. sqlcom.ExecuteNonQuery()
    7. sqlcom.Dispose()
    8. Loop Until line Is Nothing
    line wird erst zuletzt auf Nothing getestet - ich glaub nicht, dass das Command das gut findet.

    Weiters würdichnich in jedem Durchlauf ein neues Command erstellen und wieder in die Tonne hauen. Stattdessen kannstes einmal erstellen, und seinen CommandText jedesmal ändern.

    Noch besser sind natürlich parametrisierte Commands, aber sowas macht hier kaum einer ;(

    Übrigens: Geburtstag ist doch ein Datum - das sollte man auch als Datum abspeichern - nicht als String.
    Aber dazu müsstest du die Datenbank ändern, ich nehme an, das macht zu sehr Umstände.
    Setze einen Haltepunkt auf die Zeile

    VB.NET-Quellcode

    1. sqlcom.CommandText = "INSERT INTO Personen (Name, Geburtstag) VALUES ('" & spline(0) & "','" & spline(1) & "')"
    sieh Dir das Split-Resultat im Debugger an (Shift+F9), dann siehst Du sofort, wo der Hase im Pfeffer begraben liegt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Kann ja auch nicht gehen ...

    VB.NET-Quellcode

    1. Do
    2. ...
    3. line = sr.ReadLine()
    4. Dim spline() As String = Split(line, ";")
    5. ...
    6. Loop Until line Is Nothing

    Dh Split wird auch dann noch ausgeführt, wenn line schon NOTHING ist.

    Dim line as String = sr.ReadLine
    While line.Length > 0
    split...
    line = sr.readline
    End While

    EDIT:
    Mit einer kleinen Extension wirds etwas eleganter:

    VB.NET-Quellcode

    1. <Extension()> Public Function Assign(Of T)(ByRef current As T, ByVal newval As T) As T
    2. current = newval
    3. Return current
    4. End Function


    While (line.Assign(sr.ReadLine).Length > 0)
    s()=split(line,";")
    ...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „picoflop“ ()

    picoflop schrieb:

    Dh Split wird auch dann noch ausgeführt, wenn line schon NOTHING ist.

    Das sollte der TE allein rauskriegen. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!