2017-12-17 3 views
1

Ich habe eine Excel-Datei zu einem DataTable gelesen, aber nur die erste Zeile füllt die gesamte MS Access-Datenbank. Ich habe bestätigt, dass die Daten in der DataTable und in der Excel-Datei identisch sind. Mein Code ist unten gezeigt:Der erste Eintrag von DataTable füllt die gesamte Access-Datenbank

using (OleDbConnection myCon = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + outFilePath + ";Extended Properties=dBase IV")) 
{ 
    OleDbCommand cmd = new OleDbCommand(); 

    string line = "001"; 
    for (int n = 0; n < dt.Rows.Count; ++n) 
    { 

     if (String.IsNullOrEmpty(dt.Rows[n].Field<string>(0))) break; 
     cmd.CommandText = "INSERT INTO " + FileName + 
      "([JNL],[LINE],[TYPE],[DRACC],[CRACC],[EXPDRACC],[EXPCRACC]," + 
      "[DOCDATE],[REF],[DRAMT],[CRAMT]) VALUES (?,?,?,?,?,?,?,?,?,?,?)"; 

     string inacc = dt.Rows[n].Field<string>(0);     
     string justNumbers = new String(inacc.Where(Char.IsDigit).ToArray()); 
     string acc = String.Format("{0:##-######-#}", justNumbers); 
     string jnl = JNL; 
     string Ref = REF; 
     string type = TYPE; 
     int dramt = 0; 
     int cramt = 0; 
     if (type == "50") dramt = Convert.ToInt32(100 * dt.Rows[n].Field < double>(2)); 
     else cramt = Convert.ToInt32(100 * dt.Rows[n].Field < double>(2)); 

     cmd.Parameters.Add("@JNL", OleDbType.VarChar).Value = jnl; 
     cmd.Parameters.Add("@LINE", OleDbType.VarChar).Value = line; 
     cmd.Parameters.Add("@TYPE", OleDbType.VarChar).Value = type; 
     cmd.Parameters.Add("@DRACC", OleDbType.VarChar).Value = justNumbers; 
     cmd.Parameters.Add("@CRACC", OleDbType.VarChar).Value = justNumbers; 
     cmd.Parameters.Add("@EXPDRACC", OleDbType.VarChar).Value = acc; 
     cmd.Parameters.Add("@EXPCRACC", OleDbType.VarChar).Value = acc;      
     cmd.Parameters.Add("@DOCDATE", OleDbType.Date).Value = DateTime.Now; 
     cmd.Parameters.Add("@REF", OleDbType.VarChar).Value = Ref; 
     cmd.Parameters.Add("@DRAMT", OleDbType.Integer).Value = dramt; 
     cmd.Parameters.Add("@CRAMT", OleDbType.Integer).Value = cramt; 


     cmd.CommandType = CommandType.Text; 
     cmd.Connection = myCon; 
     myCon.Open(); 
     cmd.ExecuteNonQuery(); 
     myCon.Close(); 
    } 
} 

Wie löst man diese Art von Problem?

Antwort

0

Sie müssen die Parameter von Ihrem Befehl entfernen. Sie fügen immer mehr Parameter hinzu. Verwenden Sie als erste Zeile Ihrer for Anweisung die

.

Sie fügen den ersten Satz von Parametern hinzu und verwenden den gleichen Befehl, ohne sie zu löschen. Sie erhalten also einen Befehl mit der Nummer n*11 (Parameter definiert/Schleife).

Die erste Übereinstimmung in der collection wird verwendet, um Ihre Befehle params zu ersetzen, so dass Sie n Einträge mit denselben Daten erhalten.

+0

Vielen Dank mein guter Herr! Es klappt! –

Verwandte Themen