2015-10-13 13 views
5

Próbuję wstawić nowe dane do starej bazy danych .dbf utworzonej za pomocą foxpro. Baza danych zawiera wiele kolumn i nie muszę wypełniać każdego z nich.C# jak poprawnie pisać do .dbf (foxpro)

Połączenie działa. Ale teraz otrzymuję wyjątek "Pole XY nie zezwala na wartości null" dla każdego, którego nie dodaję w mojej instrukcji wstawiania. Ale baza danych jest skonfigurowana tak, aby zezwalać na wartości puste.

używam następujący kod:

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

Więc co robię źle? Czy lepiej użyć innej metody zapisu do pliku .dbf z C#?

+1

Wiadomość wydaje się całkiem jasna. Masz jedną lub więcej kolumn, które nie zezwalają na wartości NULL i nie określasz ich wartości w kwerendzie wstawiania. Proponuję sprawdzić każdą kolumnę w tej tabeli dla tego numeru – Steve

Odpowiedz

5

Prawie robisz to dobrze. Zauważ, że nazwy parametrów nie są ważne i byłyby zlokalizowane (tzn .: @KDNR jest dodawany jako pierwszy, aby odpowiadał pierwszemu? Symbolowi zastępczemu). To, czego nam brakuje, to, że pola, których nie przekazujesz, nie akceptują wartości NULL, powinieneś powiadomić połączenie, że zamiast tego chcesz "puste" wartości dla tych pól ("" dla ciągu,// ​​dla daty, 0 dla numeryczne i odwrotnie). Aby powiadomić kierowcę, należy wykonać polecenie "SET NULL OFF" w tym samym połączeniu.

Dodając to, że poprawione istniejącego kodu trochę:

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 może nie być dobrym pomysłem, ponieważ może on być pod „Program Files”, który jest tylko do odczytu.

PS2: Byłoby lepiej, gdyby dodać tam tag "VFP", zamiast "DBF".

+0

dzięki za twoją radę, teraz działa dobrze – Sandmaann