需要将新的空白记录(行)插入现有的 DBF 文件(dbase III 格式)

Need to insert new blank record (row) into an existing DBF file (dbase III format)

我正在编写一个应用程序,它必须: a.) 打开现有的 DBF 文件,然后, b.) 添加一个新的空记录(行),然后 c.) 向新记录中的一个或多个字段添加一些数据, d.) 关闭 DBF 文件

我已经有了用于打开和读取 dbf 文件并在数据网格视图中显示内容的代码。这非常有效。但是我已经搜索了 3 天,每天搜索几个小时,但在任何地方都找不到任何关于如何简单地添加一条空白记录的指导或示例。

注意:新记录应该只是一个新的空记录,附加到现有文件(该文件由另一个应用程序自动创建 - 因此所有列都已建立,不需要由我的应用程序定义)

这是我用来打开和阅读 table,然后计算行数的代码。

OleDbConnection oConn = new OleDbConnection(
        "Provider=VFPOLEDB.1;SourceType=DBF;Data Source=.\;");
oConn.Open();
System.Data.OleDb.OleDbCommand oCmd = oConn.CreateCommand();

string dbname = "SELECT * FROM C:\rmwin\poslink.dbf";

oCmd.CommandText = dbname;

DataTable emp = new DataTable();
emp.Load(oCmd.ExecuteReader());

oConn.Close();
dg1.DataSource = emp; 
int rowcount = emp.Rows.Count;

数据在 dg1(我的 datagridview 控件)中正确显示所以现在我希望它简单地向 POSLINK.DBF 添加一条新记录。 任何指导将不胜感激。

One sample showing SQL Update, but the principles are the same

首先,您的 OleDb 连接源应指向数据所在的路径,而不仅仅是 .\ 的相对路径,这可能并不总是一个好的选择。然后,您对插入、更新、删除的所有查询都从该文件夹进行操作,因此您不必明确所有路径。只是 table 名字。

 OleDbConnection oConn = new OleDbConnection(
            "Provider=VFPOLEDB.1;SourceType=DBF;Data Source=C:\rmwin\;");

现在,你的命令。添加、更新和删除,可以用比较常见的sql语句来完成。但是,不要连接您尝试插入或更新的值,这会使您暴露于 SQL-Injection。相反,OleDb 使用“?”字符作为添加到命令的参数的占位符,以及所有“?”需要按相同顺序添加参数。

所以,要获得 select,请从现在开始

System.Data.OleDb.OleDbCommand oCmd = oConn.CreateCommand();
oCmd.CommandText = "select * from PosLink";

对于插入,构建命令,确定您要插入的所有字段...显然不知道您的 table

的内容
oCmd.CommandText = 
@"insert into PosLink
   ( TryColumn1,
     TryColumn2,
     TryColumn3 )
   values
   ( ?,
     ?,
     ? ) ";

现在,添加来自 screen/source

的参数
oCmd.Parameters.AddWithValue( "parmTryColumn1", yourCSharpClassOrPropertyStringField );
oCmd.Parameters.AddWithValue( "parmTryColumn2", DateTime.Now );
oCmd.Parameters.AddWithValue( "parmTryColumn3", 12345 );

请注意,我在参数命名前加上 "parm" 只是为了了解它的参数,而不是插入的实际列。它们必须与插入的顺序相同。

然后你可以执行它...因为它是一个 INSERT,所以没有 returned,所以被认为是一个非查询,但会 return 计算受影响的记录数。 .. 如果一切正常,则期望为 1,如果因其他原因失败,则为 0 或负数。

   var recordCountInserted = oCmd.ExecuteNonQuery();

希望这可以帮助您开始并继续前进。

至于追加空白,那需要脚本。在 VFP 中,你会做类似

use SomeTable
append blank

因此,为这些命令构建一个字符串(VfpOleDb 不支持所有命令,但您期望的最常见的数据、日期、字符串、常用函数都可以工作)

oCmd.CommandText = 
@"execScript('use SomeTable
append blank
use' )";

oCmd.ExecuteNonQuery();

是的,您可以像这样编写 VFP 代码,但并非所有内容都是允许的

Many other links from my history posting for VFP, OleDb, parameterized queries, etc. There are also other strong VFP developers in this community too.