我正在编写必须满足以下条件的应用程序: 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的新记录。 任何指导将不胜感激。
答案 0 :(得分:1)
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 );
请注意,我以“ 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代码,但不允许所有操作