【问题标题】:c# how to properly write into a .dbf (foxpro)c# 如何正确写入.dbf (foxpro)
【发布时间】:2015-10-13 12:25:25
【问题描述】:

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

连接本身有效。但是现在我得到一个例外“字段 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 会更好吗?

【问题讨论】:

  • 消息似乎很清楚。您有一个或多个不允许 NULL 值的列,并且您没有在插入查询中为它们指定值。我建议检查该表中的每一列是否存在此问题

标签: c# oledb visual-foxpro


【解决方案1】:

你几乎做对了。请注意,参数名称并不重要,并且会按位置定位(即:首先添加 @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”会更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    相关资源
    最近更新 更多