c# 如何正确写入 .dbf (foxpro)
c# how to properly write into a .dbf (foxpro)
我正在尝试将新数据插入到使用 foxpro 创建的旧 .dbf 数据库中。
数据库有很多列,我不需要填写每一列。
连接本身有效。但是现在,对于我没有在插入语句中添加的每一个,我都得到了异常 "Field XY does not allow null values"。但是数据库配置为允许空值。
我正在使用以下代码:
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,以便它对应于第一个 ? 占位符)。您缺少的是,如果您未传递的字段不接受 NULL 值,那么您应该通知连接您想要这些字段的 "empty" 值('' 用于字符串,/ / 用于日期, 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 可能不是一个好主意,因为它可能在 "Program Files" 下,它是只读的。
PS2:如果你在那里添加 "VFP" 标签会更好,而不是 "DBF".
我正在尝试将新数据插入到使用 foxpro 创建的旧 .dbf 数据库中。 数据库有很多列,我不需要填写每一列。
连接本身有效。但是现在,对于我没有在插入语句中添加的每一个,我都得到了异常 "Field XY does not allow null values"。但是数据库配置为允许空值。
我正在使用以下代码:
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,以便它对应于第一个 ? 占位符)。您缺少的是,如果您未传递的字段不接受 NULL 值,那么您应该通知连接您想要这些字段的 "empty" 值('' 用于字符串,/ / 用于日期, 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 可能不是一个好主意,因为它可能在 "Program Files" 下,它是只读的。
PS2:如果你在那里添加 "VFP" 标签会更好,而不是 "DBF".