2015-10-13 21 views
5

Ich versuche, neue Daten in eine alte .dbf-Datenbank einzufügen, die mit Foxpro erstellt wurde. Die Datenbank hat viele Spalten und ich muss nicht jeden einzelnen ausfüllen.C# Wie schreibe ich richtig in eine .dbf (foxpro)

Die Verbindung selbst funktioniert. Aber jetzt bekomme ich die Ausnahme "Feld XY erlaubt keine Null-Werte" für jeden einzelnen, den ich nicht in meiner Insert-Anweisung hinzufüge. Die Datenbank ist jedoch so konfiguriert, dass Nullwerte zulässig sind.

ich den folgenden Code verwenden:

  OleDbConnection dbfcon = new OleDbConnection("Provider=VFPOLEDB.1;" + 
      "Data Source=" + Application.StartupPath + "\\Daten;"); 
     dbfcon.Open(); 

     String query = "INSERT INTO TB_KUVG (KDNR, Kuvg_id) " + 
      "VALUES(?,?)"; 
     OleDbCommand cmd = new OleDbCommand(query, dbfcon); 
     cmd.Parameters.AddWithValue("@KDNR", 1); 
     cmd.Parameters.AddWithValue("@Kuvg_id", 1); 
     cmd.ExecuteNonQuery(); 

     dbfcon.Close(); 

Also, was mache ich falsch? Ist es besser, einen anderen Weg zu verwenden, um in eine .dbf von C# zu schreiben?

+1

Die Nachricht scheint ziemlich klar zu sein. Sie haben eine oder mehrere Spalten, die keine NULL-Werte zulassen, und Sie geben in der Einfügeabfrage keinen Wert für sie an. Ich schlage vor, jede Spalte in dieser Tabelle für diese Ausgabe zu überprüfen – Steve

Antwort

5

Sie machen es fast schon richtig. Beachten Sie, dass Parameternamen nicht wichtig sind und sich positionsmäßig befinden (dh: @KDNR wird zuerst hinzugefügt, so dass es dem ersten Platzhalter entspricht). Was Sie vermissen, ist, wenn die Felder, die Sie nicht übergeben, NULL-Werte nicht akzeptieren, dann sollten Sie die Verbindung benachrichtigen, dass stattdessen "leere" Werte für diese Felder ('' für Zeichenfolge,// ​​für Datum, 0 für numerisch und umgekehrt). Um den Treiber zu benachrichtigen, führen Sie 'SET NULL OFF' für dieselbe Verbindung aus.

Während es das Hinzufügen, revidierte ich Ihr ein wenig vorhandenen Code:

string dataFolder = Path.Combine(Application.StartupPath, "Daten"); 
String query = @"INSERT INTO TB_KUVG 
      (KDNR, Kuvg_id) 
      VALUES 
      (?,?)"; 
using (OleDbConnection dbfcon = new OleDbConnection("Provider=VFPOLEDB;Data Source=" + dataFolder)) 
{ 
    OleDbCommand cmd = new OleDbCommand(query, dbfcon); 
    cmd.Parameters.AddWithValue("@KDNR", 1); 
    cmd.Parameters.AddWithValue("@Kuvg_id", 1); 

    dbfcon.Open(); 
    new OleDbCommand("set null off",dbfcon).ExecuteNonQuery(); 
    cmd.ExecuteNonQuery(); 
    dbfcon.Close(); 
} 

PS: Application.StartupPath vielleicht keine gute Idee sein, wie es unter „Program Files“ sein kann, die nur gelesen wird.

PS2: Es wäre besser, wenn Sie dort "VFP" anstelle von "DBF" hinzugefügt hätten.

+0

danke für Ihren Rat, es funktioniert jetzt gut – Sandmaann