2017-12-14 40 views
0

Ich habe eine Anwendung, die über Ole-DB mit CSV-Daten verbindet. Die CSV-Daten werden in eine Datentabelle geladen. Dann iteriere ich durch die Datarows der Tabelle. Für jedes Datenfeld wird eine Funktion aufgerufen, die die Daten in eine mysql-db einfügt.Seltsames Verhalten der Ausnahme mit OLEDB zu CSV

private void ConvertCSVDocument() 
{ 
    try 
    { 
     using (var dataSet = base.Source.CreateDataSet()) 
     { 
      using (var dataTable = dataSet.Tables[0]) 
      { 
       base.Progress(dataTable.Rows.Count, 0); 

       for (int i = 0; i < dataTable.Rows.Count; i++) 
       { 
        try 
        { 
         this.ConvertCSVDocumentRow(dataTable.Rows[i]); 
        } 
        catch (Exception e) 
        { 
         base.Report($"Row {i.ToString("0000")} {e}"); 
        } 
        finally 
        { 
         base.Progress(dataTable.Rows.Count, i); 
        } 
       } 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     base.Report($"Fatal error: {e}"); 
    } 
} 

Wenn ich diesen Code ausführen, wird eine Ausnahme auf der Linie geworfen, wo mein dataSet erstellt (using var dataSet = base.Source.CreateDataSet())

ich die folgende Meldung:

Fatal error: System.ArgumentException: illegal OleAut-Date. bei System.DateTime.DoubleDateToTicks(Double value) bei System.Data.OleDb.ColumnBinding.Value_DATE() bei System.Data.OleDb.ColumnBinding.Value() bei System.Data.OleDb.OleDbDataReader.GetValues(Object[] values) bei System.Data.ProviderBase.DataReaderContainer.CommonLanguageSubsetDataReader.GetValues(Object[] values) bei System.Data.ProviderBase.SchemaMapping.LoadDataRow() bei System.Data.Common.DataAdapter.FillLoadDataRow(SchemaMapping mapping) bei System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue) bei System.Data.Common.DataAdapter.Fill(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords) bei System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) bei System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior) bei System.Data.Common.DbDataAdapter.Fill(DataTable dataTable) bei FooKonvert.Context.Csv.CsvContext.CreateDataSet() in D:\Projekte\csharp\Tools\Foo\FooKonvert\Context\Csv\CsvContext.cs:Zeile 42. bei FooKonvert.Converter.FooConverter.ConvertCSVDocument() in D:\Projekte\csharp\Tools\Foo\FooKonvert\Converter\FooConverter.cs:Zeile 395.

Wenn ich die Zeile aus kommentieren this.ConvertCSVDocumentRow(dataTable.Rows[i]); Die Ausnahme wird nicht ausgelöst und die Iteration durch die Datenzeilen ist erfolgreich.

Kann jemand erklären, was passiert? Der Fehler tritt auf, bevor die Zeile gerade aufgerufen wird. Wenn die Ausnahme ausgelöst wird, wurde diese Funktion nicht einmal aufgerufen.

#

Hier ist, wie ich den Datensatz zu erstellen:

public DataSet CreateDataSet() 
{ 
    string connectionString = $"provider=Microsoft.Jet.OLEDB.4.0; data source={this.FilePath};Extended Properties=\"Text;HDR=yes;\""; 

    using (OleDbConnection connection = new OleDbConnection(connectionString)) 
    { 
     connection.Open(); 

     OleDbDataAdapter adapter = new OleDbDataAdapter($"SELECT * FROM [{this.FileName}]", connection); 

     var dataSet = new DataSet(); 
     var dataTable = new DataTable(); 

     adapter.Fill(dataTable); 
     dataSet.Tables.Add(dataTable); 

     return dataSet; 
    } 
} 

Hier ist eine abstrakte Version der ConvertSCVDocumentRow-Funktion:

try 
{ 
    var forename = dataRow["some_column_name_1"].ToString(); 
    var surename = dataRow["some_column_name_2"].ToString(); 

    int person_ident = GetIdentForPerson(forename,surename); 

    if (person_ident <= 0) 
    { 
     InsertPerson(forename,surename);     
    } 
} 
catch(Exception e) 
{ 
    throw new Exception("Failed to convert person!", e); 
} 
+0

Können Sie die Nachricht nach 'System.ArgumentException' übersetzen und die' ConvertCSVDocumentRow' Methode bereitstellen? Es ist möglich, dass Sie ein falsches Methodenargument verwenden. –

+1

Der Fehler ist darauf zurückzuführen, dass oledb versucht, die Eingabe in ein Date zu konvertieren. Oledb verwendet entweder den JET-Treiber in Windows oder den ACE-Treiber von Microsoft Office. Oldedb ist die Standardmethode, die in Excel verwendet wird, und der Fehler, den Sie in Excel sehen würden, wenn eine Zelle auf Allgemein gesetzt ist. Die Formatierung von Zahlen in Datumsangaben und Datumsangaben ist auf die oledb-Methoden zurückzuführen. Ein bekanntes Problem mit oledb ist die erste Spalte, in der Daten automatisch in Ganzzahlen geändert werden. Also ich denke, dass Ihr Fehler wegen oledb Änderung der ersten Spalte von Datum zu int dann fehlgeschlagen ist, ein int in eine Spalte in Datentabelle als Datum deklariert. – jdweng

+0

erste Spalte, die gelesen wird? Oder erste Spalte der ersten Tabelle? Ich lese jeden Wert mit dataRow ["irgendein_Name"]. ToString(). – Olli

Antwort

0

Wie Rune Grimstadt es andere Optionen für das Lesen sind erwähnt CSV-Dateien zu einem Dataset. Hier ist eine Lösung mit FileStream im Internet:

Das funktionierte für mich.