2015-10-13 31 views
5

Sto cercando di inserire nuovi dati in un vecchio database .dbf creato con foxpro. Il database ha un sacco di colonne e non ho bisogno di riempire ogni singolo.C# come scrivere correttamente in un file .dbf (foxpro)

La connessione funziona. Ma ora sto ottenendo l'eccezione "Campo XY non consente valori nulli" per ogni singolo che non sto aggiungendo nella mia istruzione di inserimento. Ma il database è configurato per consentire valori nulli.

Sto usando il seguente codice:

  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(); 

Così che cosa sto facendo di sbagliato? È meglio usare un altro modo per scrivere in un file .dbf da C#?

+1

Il messaggio sembra essere abbastanza chiaro. Hai una o più colonne che non consentono valori NULL e non specifichi un valore per loro nella tua query di inserimento. Suggerisco di controllare tutte le colonne di quel tavolo per questo numero – Steve

risposta

5

Stai quasi facendo bene. Si noti che i nomi dei parametri non sono importanti e dovrebbero essere posizionati in modo posizionale (ad esempio: @KDNR viene aggiunto per primo in modo che corrisponda al primo? Segnaposto). Quello che ti manca è che se i campi che non passi non accettano valori NULL, devi avvisare la connessione che invece vuoi valori "vuoti" per quei campi ('' per stringa,// ​​per data, 0 per numerico e viceversa). Per notificare al conducente, si esegue 'SET NULL OFF' sulla stessa connessione.

Mentre l'aggiunta di esso, ho rivisto il codice esistente un po ':

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 potrebbe non essere una buona idea come può essere sotto "Programmi", che è di sola lettura.

PS2: Sarebbe meglio se tu aggiungessi il tag "VFP" al posto di "DBF".

+0

grazie per il tuo consiglio, ora funziona bene – Sandmaann