我正在写一个必须的应用程序:a。)打开一个现有的DBF文件,然后,b。)添加一个新的空记录(行),然后c。)将一些数据添加到新记录中的一个或多个字段, d。)关闭DBF文件
我已经有代码工作打开并读取dbf文件并在datagridview中显示内容。这非常有效。但我现在已经搜索了3天,一天几个小时,并且找不到任何关于如何简单地添加单个空白记录的任何指导或示例。
注意:新记录应该只是一个新的空记录,附加到现有文件(该文件由另一个应用程序自动创建 - 所以所有列都已建立,不需要由我的应用程序定义)
这是我用来打开和读取表格的代码,然后计算行数。
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连接源应该指向数据所在的路径,而不仅仅是。\的相对路径,这可能并不总是一个好的选择。然后,您对插入,更新,删除的所有查询都在该文件夹中运行,因此您不必明确所有路径。只是表名。
OleDbConnection oConn = new OleDbConnection(
"Provider=VFPOLEDB.1;SourceType=DBF;Data Source=C:\\rmwin\\;");
现在,你的命令。要添加,更新和删除,您可以使用相对常见的sql语句。但是,不要连接您尝试插入或更新的值,这会使您暴露于SQL注入。相反,OleDb使用“?”字符作为添加到命令的参数的占位符,以及所有“?”需要以相同的顺序添加参数。
所以,要获得选择,请按照您的要求开始
System.Data.OleDb.OleDbCommand oCmd = oConn.CreateCommand();
oCmd.CommandText = "select * from PosLink";
对于插入,构建命令,识别您要插入的所有字段...显然不知道您的表的内容
oCmd.CommandText =
@"insert into PosLink
( TryColumn1,
TryColumn2,
TryColumn3 )
values
( ?,
?,
? ) ";
现在,添加来自屏幕/来源的任何地方的参数
oCmd.Parameters.AddWithValue( "parmTryColumn1", yourCSharpClassOrPropertyStringField );
oCmd.Parameters.AddWithValue( "parmTryColumn2", DateTime.Now );
oCmd.Parameters.AddWithValue( "parmTryColumn3", 12345 );
请注意,参数命名I前缀为“parm”只是为了知道它的参数而不是插入的实际列。它们必须与插入顺序相同。
然后你可以执行它...因为它是一个INSERT,所以没有返回任何内容,所以被认为是非查询,但会返回受影响的记录数量...如果一切正常则预计为1,如果一切正常,则为0其他任何事情都失败了。
var recordCountInserted = oCmd.ExecuteNonQuery();
希望这可以帮助您开始并在路上。
至于做一个追加空白,那就需要一个脚本。在VFP中,你会做类似的事情
use SomeTable
append blank
因此,为这些命令构建一个字符串(VfpOleDb中不支持所有命令,但最常见的是数据,日期,字符串,常用函数可以正常工作)
oCmd.CommandText =
@"execScript('use SomeTable
append blank
use' )";
oCmd.ExecuteNonQuery();
是的,您可以像这样执行VFP代码,但不是所有内容都允许