首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要在现有的DBF文件(dbase III格式)中插入新的空白记录(行)

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

Stack Overflow用户
提问于 2019-04-26 22:20:32
回答 1查看 3.2K关注 0票数 0

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

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

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

下面是我用来打开和读取表,然后计算行数的代码。

代码语言:javascript
复制
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中添加一条新记录,任何指导都将非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-26 23:02:40

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

首先,您的OleDb连接源应该指向数据所在的路径,而不只是.\的相对路径,这可能并不总是一个好的选择。然后,您对insert、update、delete的所有查询都是从该文件夹操作的,因此您不必显式地指定所有路径。只有表名。

代码语言:javascript
复制
 OleDbConnection oConn = new OleDbConnection(
            "Provider=VFPOLEDB.1;SourceType=DBF;Data Source=C:\\rmwin\\;");

现在,该你指挥了。要添加、更新和删除,可以使用相对常见的sql语句。但是,不要连接您试图插入或更新的值,这会使您暴露于SQL注入。相反,OleDb使用"?“字符作为添加到命令中的参数的占位符,以及全部"?“需要以相同的顺序添加参数。

因此,要获得select,请按如下方式开始

代码语言:javascript
复制
System.Data.OleDb.OleDbCommand oCmd = oConn.CreateCommand();
oCmd.CommandText = "select * from PosLink";

对于insert,构建命令,识别您试图插入的所有字段...显然不知道你表格的内容

代码语言:javascript
复制
oCmd.CommandText = 
@"insert into PosLink
   ( TryColumn1,
     TryColumn2,
     TryColumn3 )
   values
   ( ?,
     ?,
     ? ) ";

现在,添加来自屏幕/源代码的参数

代码语言:javascript
复制
oCmd.Parameters.AddWithValue( "parmTryColumn1", yourCSharpClassOrPropertyStringField );
oCmd.Parameters.AddWithValue( "parmTryColumn2", DateTime.Now );
oCmd.Parameters.AddWithValue( "parmTryColumn3", 12345 );

请注意,我以"parm“为前缀的参数命名只是为了知道它是一个参数,而不是插入的实际列。它们的顺序必须与插入的顺序相同。

然后你就可以执行它..。因为它是一个INSERT,所以不会返回任何东西,因此被认为是一个非查询,但将返回受影响的记录数量的计数...如果一切正常,则期望为1;如果其他情况失败,则期望为0或负数。

代码语言:javascript
复制
   var recordCountInserted = oCmd.ExecuteNonQuery();

希望这篇文章能帮助你开始并上路。

至于做一个附加空白,这需要一个脚本。在VFP中,你可以这样做

代码语言:javascript
复制
use SomeTable
append blank

因此,为这些命令构建一个字符串(并不是所有的命令在VfpOleDb中都受支持,但最常见的是数据、日期、字符串、通用函数)

代码语言:javascript
复制
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.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55869601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档