2016-05-13 12 views
3

Ich schreibe ein Programm, das Millionen von Datensätzen in csv in kurzer Zeit handhaben sollte, meine Idee war, odbc wegen der Leistungsgründe zu verwenden, deshalb lese ich alle Daten mit odbc und speichern sie im Speicher, i danach Parameter hinzufügen und legen sie sie in sQL-Datenbank, hier ist mein Code so weit:odbc reader für csv in vb.net

Using connection As New OdbcConnection("jdbc:odbc:Driver={Microsoft Text Driver (*.txt; *.csv)};" & filePath & "Extensions=csv;Persist Security Info=False;") 
       Dim reader As OdbcDataReader 

       Dim i As Integer 
       Dim r As SeekZeilen 

       Dim TextFileTable As DataTable = Nothing 


       Dim line As String = reader.Read() 
       Me.ParseString(line) 

       Dim memStream As New MemoryStream(Encoding.Default.GetBytes(line)) 

       Using TextFileReader As New Microsoft.VisualBasic.FileIO.TextFieldParser(memStream) 
        TextFileReader.TextFieldType = FileIO.FieldType.Delimited 
        TextFileReader.SetDelimiters(";") 
        r.erste_Zeile = TextFileReader.ReadFields() 

        If TextFileTable Is Nothing Then 
         TextFileTable = New DataTable("TextFileTable") 

         For i = 0 To r.erste_Zeile.Length - 1 
          Dim Column As New DataColumn(r.erste_Zeile(i)) 

          Column.ReadOnly = True 
          TextFileTable.Columns.Add(Column) 
         Next 
        End If 
        DataGridView1.DataSource = TextFileTable 
       End Using 

       While reader.HasRows 
        line = reader.Read() 
        Me.ParseString(line) 
        memStream = New MemoryStream(Encoding.Default.GetBytes(line)) 

        Using TextFileReader As New Microsoft.VisualBasic.FileIO.TextFieldParser(memStream) 
         TextFileReader.TextFieldType = FileIO.FieldType.Delimited 
         TextFileReader.SetDelimiters(";") 

         DataGridView1.DataSource = TextFileTable 
         Try 
          r._Rest = TextFileReader.ReadFields() 


          ReplaceChars(r._Rest) 

          If Not r._Rest Is Nothing Then 
           Dim oSQL As New DBUmgebung.cdb.SQL() 
           oSQL.init() 
           AddParameters(oSQL, r) 
           oSQL.ausfuehrenSQL(DBUmgebung.cdb.KSQLCommand.INSERT, _table, "") 
           Dim dtRow As DataRow = TextFileTable.NewRow 

           For i = 0 To r._Rest.Length - 1 

            dtRow(i) = r._Rest(i).ToString() 
           Next 

           TextFileTable.Rows.Add(dtRow) 
           DataGridView1.Refresh() 
           Application.DoEvents() 
          End If 
         Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException 
          MsgBox("Error! " & ex.Message & _ 
          "") 

         Catch sqlEx As SqlException 
          MessageBox.Show(sqlEx.Message) 

          rtbSql.Focus() 
          Exit For 
         Catch ex As Exception 
          MessageBox.Show(ex.Message) 
          rtbSql.Focus() 
          Exit For 

         End Try 
        End Using 
       End While 
       reader.Close() 
      End Using 

das Problem ist, dass ich null-Zeiger-Ausnahme für einen unbekannten Grund zu bekommen, hat jemand Ahnung, was ich falsch gemacht? liegt es wahrscheinlich daran, dass mein odbc reader nicht richtig initialisiert ist?

+0

Ich erinnere mich, einmal in so etwas zu laufen. Von was ich recherchiert habe und OleDbConnection getan habe, liest man die Excel-Datei als Text ein, ansonsten könnte man auf das eben beschriebene Problem stoßen. – codeMonger123

+0

Ich habe versucht, das zu beheben, indem ich Odbccommand 'Dim Cmd As New OdbcCommand' initialisiere und 'reader = cmd.ExecuteReader()' ausführe und jetzt bekomme ich eine ungültige Operation exception – Sparkm4n

Antwort

3

Versuchen Sie dies. Dies liest die CSV-Datei als den gesamten Text in eine Datentabelle. Sobald Sie in der Datatable angekommen sind, können Sie die Datensätze in SQL einfügen. Sie können dies immer anpassen, um mehrere CSV-Dateien zu bearbeiten.

Friend Shared Function GetExcelFile(ByVal strFileName As String, ByVal strPath As String) As DataTable 

    Try 

     Dim dt As New DataTable 

      Dim ConStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPath & ";Extended Properties=""Text;HDR=Yes;FMT=Delimited\""" 
      Dim conn As New OleDb.OleDbConnection(ConStr) 
      Dim da As New OleDb.OleDbDataAdapter("Select * from " & strFileName, conn) 
      da.Fill(dt) 

     Return dt 

    Catch ex As Exception 
     Return Nothing 
    End Try 

End Function 
+0

lass es mich wissen, wenn das deine Frage beantwortet. Danke – codeMonger123

+0

Sparkm - achten Sie auf die Verbindungszeichenfolge Parameter in diesem Beitrag. Dies kann Ihr ursprüngliches Problem beheben. – rheitzman

+1

Nun, ich muss wissen, wie ich nur normale csv-Dokumente ohne SQL zuerst lesen konnte. Wie ich in den letzten Post gelesen habe, ist die ODBC die leistungsstärkste Möglichkeit, große CSV-Dateien zu lesen, gibt es eine einfachere Möglichkeit, odbc zu verwenden? – Sparkm4n