c#如何正确写入.dbf(foxpro)

c#如何正确写入.dbf(foxpro),c#,oledb,visual-foxpro,C#,Oledb,Visual Foxpro,我正在尝试将新数据插入到用foxpro创建的旧.dbf数据库中。 数据库有很多列,我不需要填写每一列 连接本身可以工作。但是现在,对于我没有在insert语句中添加的每一个字段,我都会得到一个异常“fieldxy不允许空值”。但数据库配置为允许空值 我正在使用以下代码: OleDbConnection dbfcon = new OleDbConnection("Provider=VFPOLEDB.1;" + "Data Source=" + Applic

我正在尝试将新数据插入到用foxpro创建的旧.dbf数据库中。 数据库有很多列,我不需要填写每一列

连接本身可以工作。但是现在,对于我没有在insert语句中添加的每一个字段,我都会得到一个异常“fieldxy不允许空值”。但数据库配置为允许空值

我正在使用以下代码:

         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是否更好?

您几乎做对了。请注意,参数名称并不重要,而是位于位置上(即:首先添加@KDNR,使其对应于第一个占位符)。您缺少的是,如果未传递的字段不接受空值,则应通知连接,您希望这些字段的值为“空”(“”表示字符串,//表示日期,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”会更好。

消息似乎非常清楚。您有一个或多个不允许空值的列,并且在insert查询中没有为它们指定值。我建议检查该表中的每一列以了解此问题