2010-07-11 29 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

相關問題