Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用BDE和Delphi访问数据库文件的好方法是什么?_Delphi_Bde_Dbase - Fatal编程技术网

使用BDE和Delphi访问数据库文件的好方法是什么?

使用BDE和Delphi访问数据库文件的好方法是什么?,delphi,bde,dbase,Delphi,Bde,Dbase,首先,我必须声明,对于Delphi,我是一个完全的新手,尽管我在学校做过一些Turbo Pascal编程,大约十四年前 我有一个商业Delphi程序,它使用dBase数据库和BDE来访问它们。我基本上需要将另一个用C编写的应用程序连接到此数据库,以便能够执行SQL操作,如选择、插入、更新和删除 不幸的是,对数据库使用OLEDB会导致索引中断,似乎只有本机BDE应用程序能够安全地访问数据 一般的想法是创建一个简单的Delphi控制台应用程序,它可以从标准的input read/ReadLn读取SQ

首先,我必须声明,对于Delphi,我是一个完全的新手,尽管我在学校做过一些Turbo Pascal编程,大约十四年前

我有一个商业Delphi程序,它使用dBase数据库和BDE来访问它们。我基本上需要将另一个用C编写的应用程序连接到此数据库,以便能够执行SQL操作,如选择、插入、更新和删除

不幸的是,对数据库使用OLEDB会导致索引中断,似乎只有本机BDE应用程序能够安全地访问数据

一般的想法是创建一个简单的Delphi控制台应用程序,它可以从标准的input read/ReadLn读取SQL语句,并将CSV数据输出到标准的output WriteLn

我该怎么做呢

我通过以下代码成功获得了简单的TTable工作访问权限:

tbl := TTable.Create(nil);

tbl.DatabaseName := 'Exceline';
tbl.TableName := 'KUNDE.DBF';
tbl.Active := True;

WriteLn(tbl.RecordCount);

tbl.Active := False;

是否有一种方法可以实现同样的效果,但可以改为执行直接SQL语句?

您可以使用TQuery组件实现同样的效果:

qry := TQuery.Create(nil);

qry.DatabaseName := 'Exceline';
qry.SQL.Add('SELECT COUNT(*) AS CNT FROM KUNDE');
qry.Active := True;

WriteLn(qry.FieldByName('CNT').AsString);

qry.Active := False;

您可以使用TQuery组件执行相同的操作:

qry := TQuery.Create(nil);

qry.DatabaseName := 'Exceline';
qry.SQL.Add('SELECT COUNT(*) AS CNT FROM KUNDE');
qry.Active := True;

WriteLn(qry.FieldByName('CNT').AsString);

qry.Active := False;

正如Serg所写的:您可以使用tquery对象在dbase表上执行sql查询。但要注意:您建议的方法是通过stdin将sql查询传递给程序,并让它在stdout上返回结果,这在Windows上非常缓慢

此外,如果查询结果很大,您还必须向程序中添加其他命令,以便批量返回数据。 使用C语言编写Delphi中的COM服务器可能更容易,而且性能也会更好


最后一点:BDE已经好几年没有得到Borland/Codegear/Embarcadero的支持了。它仍然可以工作,但它越来越难保持这种方式,尤其是与较新的Windows版本比XP。另一种选择可能是tdbf see sourceforge,但我在这方面的经验不足,无法给您提供有根据的意见。

正如Serg所写:您可以使用tquery对象对数据库表执行sql查询。但要注意:您建议的方法是通过stdin将sql查询传递给程序,并让它在stdout上返回结果,这在Windows上非常缓慢

此外,如果查询结果很大,您还必须向程序中添加其他命令,以便批量返回数据。 使用C语言编写Delphi中的COM服务器可能更容易,而且性能也会更好

最后一点:BDE已经好几年没有得到Borland/Codegear/Embarcadero的支持了。它仍然可以工作,但它越来越难保持这种方式,尤其是与较新的Windows版本比XP。另一种选择可能是tdbf see sourceforge,但我在这方面的经验不足,无法为您提供有根据的意见。

因为自10年前被弃用以来,它一直没有得到维护:

你考虑过了吗?它是一个可以访问dBase、Clipper和其他数据库的服务器

它真的很好用,而且有一个

这将使您的解决方案路径不那么复杂

-jeroen

自10年前被弃用以来,一直未对其进行维护:

你考虑过了吗?它是一个可以访问dBase、Clipper和其他数据库的服务器

它真的很好用,而且有一个

这将使您的解决方案路径不那么复杂


-杰罗恩

谢谢你的回复,实际上我也试过类似的东西,效果非常好。AsString如何处理空值?@thomask-返回我记得的空字符串。您可以使用TField.IsNull方法检查空值,例如[如果qry.FieldByName'CNT'.IsNull,那么…]谢谢您的回复,我实际上尝试了类似的方法,效果非常好。AsString如何处理空值?@thomask-返回我记得的空字符串。您可以使用TField.IsNull方法检查空值,例如[如果qry.FieldByName'CNT'.IsNull,那么…]这听起来是个不错的建议,您是否有任何机会可以指导我如何开始编写COM服务器?这听起来是个不错的建议,您是否有任何机会可以指导我如何开始编写COM服务器?正如下面有人所说,BDE已被严重弃用,您不应该在新代码中使用它!:-数据库,伙计?!1989年打电话给它,它希望它恢复数据库文件格式。至少使用下面提到的tdbf,您可以删除可怕的BDE可再发行包。祝你好运正如下面有人所说,BDE已被严重弃用,您不应该在新代码中使用它数据库,伙计?!1989年打电话给它,它希望它恢复数据库文件格式。至少使用下面提到的tdbf,您可以删除可怕的BDE可再发行包。祝你好运