2010-07-11 45 views
1

首先,我必须声明,我是一个完整的福利局当涉及到德尔福,虽然我没有在学校的一些Turbo Pascal的编程,一些十四年前...什么是使用BDE和Delphi访问dBase文件的好方法?

我有一个商业德尔福计划,使用dBase数据库和BDE来访问它们。我基本上需要将用C#编写的另一个应用程序连接到这个数据库,以便能够执行诸如select,insert,update和delete之类的SQL操作。

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

总的想法是创建可能从标准输入读取SQL语句简单的德尔福控制台应用程序(读/ ReadLn)和输出CSV数据标准输出(WriteLn)。

我该怎么做呢?

我已经成功地得到了简单的TTable访问工作,用下面的代码:

tbl := TTable.Create(nil); 

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

WriteLn(tbl.RecordCount); 

tbl.Active := False; 

有没有一种方法,我可以达到同样的,而是由直接执行SQL语句呢?

+0

正如有人在下面说的,BDE被严重废弃了,你不应该在新代码中使用它! :-) dBase,男人?! 1989年调用,它希望它恢复数据库文件格式。至少用tdbf(下面提到)你可以放弃可怕的BDE-redistributable软件包。祝你好运! – 2010-07-13 19:56:26

回答

8

你可以做同样的使用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; 
+0

感谢您的回复,我实际上已经尝试过类似的尝试,并且工作完美。 AsString如何处理空值? – 2010-07-11 13:35:15

+0

@thomask - 按照我的记忆返回一个空字符串。你可以使用TField.IsNull方法检查空值,例如[如果qry.FieldByName('CNT')。IsNull然后...] – kludg 2010-07-11 14:03:11

4

由于SERG已经写道:您可以使用TQuery的对象对dBASE表执行SQL查询。但要小心:你建议这样做的方式 - 通过stdin将sql查询传递给程序,并让它返回stdout上的结果 - 在Windows上非常缓慢。

此外,如果查询结果很大,您将不得不向程序添加额外的命令以批量返回数据。 它可能会更容易,并会给你更好的性能,写在Delphi的COM服务器从C#使用。

最后一点:Borland/Codegear/Embarcadero几年来一直没有支持BDE。它仍然有效,但以这种方式越来越困难,尤其是对于比XP更新的Windows版本。一种替代方案可能是tdbf(参见sourceforge),但我没有足够的经验来给你一个关于它的信息。

+0

这听起来像一个很好的建议,你有任何机会有任何指示我怎么可以得到开始写一个COM服务器? – 2010-07-11 13:38:13

+0

+1对于tdbf。我会这样 – 2010-07-12 05:47:59

相关问题