使用BDE和Delphi访问数据库文件的好方法是什么?
首先,我必须声明,对于Delphi,我是一个完全的新手,尽管我在学校做过一些Turbo Pascal编程,大约十四年前 我有一个商业Delphi程序,它使用dBase数据库和BDE来访问它们。我基本上需要将另一个用C编写的应用程序连接到此数据库,以便能够执行SQL操作,如选择、插入、更新和删除 不幸的是,对数据库使用OLEDB会导致索引中断,似乎只有本机BDE应用程序能够安全地访问数据 一般的想法是创建一个简单的Delphi控制台应用程序,它可以从标准的input read/ReadLn读取SQL语句,并将CSV数据输出到标准的output WriteLn 我该怎么做呢 我通过以下代码成功获得了简单的TTable工作访问权限:使用BDE和Delphi访问数据库文件的好方法是什么?,delphi,bde,dbase,Delphi,Bde,Dbase,首先,我必须声明,对于Delphi,我是一个完全的新手,尽管我在学校做过一些Turbo Pascal编程,大约十四年前 我有一个商业Delphi程序,它使用dBase数据库和BDE来访问它们。我基本上需要将另一个用C编写的应用程序连接到此数据库,以便能够执行SQL操作,如选择、插入、更新和删除 不幸的是,对数据库使用OLEDB会导致索引中断,似乎只有本机BDE应用程序能够安全地访问数据 一般的想法是创建一个简单的Delphi控制台应用程序,它可以从标准的input read/ReadLn读取SQ
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可再发行包。祝你好运