2015-10-13 18 views
5

foxproで作成した古い.dbfデータベースに新しいデータを挿入しようとしています。 データベースには多くの列があり、1つ1つを記入する必要はありません。c#.dbf(foxpro)に正しく書き込む方法

接続自体が機能します。しかし、今私は私の挿入ステートメントに追加していないすべての1つの例外 "フィールドXYはnull値を許可していません"を取得します。しかし、データベースはヌル値を許可するように構成されています。

私は、次のコードを使用しています:

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

をだから私は間違って何をやっていますか? C#から.dbfに書き込む別の方法を使用する方が良いですか?

+1

メッセージはかなり明確です。 NULL値を許可しない1つ以上の列があり、挿入クエリで値が指定されていません。私はこの問題のためにそのテーブルのすべての列を確認することをお勧めします – Steve

答えて

5

あなたはほとんどそれを正しくやっています。パラメータ名は重要ではなく、位置的に配置されます(つまり、@ KDNRが最初に追加され、最初の?プレースホルダに対応する)。欠けているものは、あなたが渡さないフィールドがNULL値を受け入れない場合、それらのフィールドの空の値を必要とすることを接続に通知する必要があります( '' 'は文字列、/ /は日付、0は数値とその逆)。ドライバに通知するために、同じ接続で「SET NULL OFF」を実行します。

それを追加している間、私はあなたの既存のコードは少し改訂:

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は良いアイデアではないかもしれません。

PS2:「DBF」ではなく「VFP」タグを追加した方が良いでしょう。

+0

あなたの助言に感謝、それは今うまく動作します – Sandmaann

関連する問題