2015-10-13 75 views
5

我试图插入新的数据到用foxpro创建的旧的.dbf数据库中。 数据库有很多列,我不需要填写每一个列。c#如何正确写入.dbf(foxpro)

连接本身起作用。但现在我得到了异常“字段XY不允许空值”为我没有添加在我的插入语句中的每一个。但数据库被配置为允许空值。

我使用下面的代码:

  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值,并且您没有在插入查询中为它们指定值。我建议检查该表中每一列的这个问题 – 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:如果您在那里添加了“VFP”标签,而不是“DBF”,会更好。

+0

感谢您的建议,现在工作正常 – Sandmaann