我正在使用 Delphi XE 開發應用程式。我有很多長 SQL 查詢,我不想將它們存盤在如下代碼中,因為這種方法會降低代碼的可讀性:
CONST_SQL1 = 'SELECT ... FROM ..'#13#10 'WHERE ...';
也許創建一個 DataModule 并將 SQL 查詢存盤在 Memo 組件中可能是另一種選擇。這樣 SQL 查詢將比上面的方法更具可讀性,但是這樣,我必須在 DataModule 中添加許多 Memo 組件,如 Memo_SQL1、Memo_SQL2、Memo_SQL3 ......
此外,我不想將這些 SQL 查詢存盤在單獨的檔案或資料庫中。
是否有一個組件可以將所有這些 SQL 查詢存盤在其中,或者您在這種情況下的最佳做法是什么?
uj5u.com熱心網友回復:
非常感謝您的所有評論。在我的專案中,我只喜歡一個檔案,那就是程式的 EXE。因為我不想要任何其他單獨的檔案,所以我更喜歡將 SQL 查詢存盤在 EXE 資源中。由于 SQL 查詢經常更改,并且將 SQL 查詢存盤在資料庫中需要額外的插入作業,因此我不喜歡將它們存盤在資料庫中。
我試圖為我的需要開發最基本和最有用的方法。在這種方法中,所有 SQL 查詢都以單一 XML 檔案格式存盤在 EXE 資源中。如果這種方法可以幫助任何其他人,我將在下面分享。
SQLQuery.rc:
SQLQueries RCDATA SQLQueries.xmlSQLQueries.xml(在 UTF-8 中):
<?xml version="1.0" encoding="utf-8"?> <SQLQueries> <SQLQuery SQLQueryName="SQL1"> SELECT * FROM TABLE1 WHERE 1 = 1 </SQLQuery> <SQLQuery SQLQueryName="SQL2"> SELECT * FROM TABLE2 WHERE 2 = 2 </SQLQuery> </SQLQueries>專案1.dpr:
program Project1; {$APPTYPE CONSOLE} {$R Project1.res} // program's default res file storing the icon, version info, etc.. {$R 'SQLQueries.res' 'SQLQueries.rc'} // add this line. if not SQLQueries.res automatically created after compile, try dragging and dropping SQLQueries.rc file to the project. uses Windows, Classes, XMLDoc, XMLIntf, Generics.Collections, ActiveX; var SQLDictionary: TDictionary<string,string>; procedure LoadGetSQLQueries; var ResourceStream: TResourceStream; XMLDocument: IXMLDocument; XMLNode: IXMLNode; i: Integer; begin ResourceStream := TResourceStream.Create(HInstance, 'SQLQUERIES', RT_RCDATA); try XMLDocument := TXMLDocument.Create(nil); try XMLDocument.LoadFromStream(ResourceStream); for i := 0 to XMLDocument.ChildNodes['SQLQueries'].ChildNodes.Count - 1 do begin XMLNode := XMLDocument.ChildNodes['SQLQueries'].ChildNodes[i]; SQLDictionary.AddOrSetValue(XMLNode.Attributes['SQLQueryName'], XMLNode.Text); end; finally XMLDocument := nil; end; finally ResourceStream.Free; end; end; begin CoInitialize(nil); try SQLDictionary := TDictionary<string,string>.Create; try LoadGetSQLQueries; Writeln(SQLDictionary['SQL1']); Readln; finally SQLDictionary.Free; end; finally CoUninitialize; end; end.使用我命名的資源
SQLQueries及其內容編譯 EXE:
程式的輸出
Writeln(SQLDictionary['SQL1'])驗證 SQL 查詢已被成功讀取XMLDocument.LoadFromStream(ResourceStream):
uj5u.com熱心網友回復:
提示,您可以在資料庫服務器上使用視圖,在您使用的 delphi 代碼中SELECT * FROM VW_CUSTOMER,您始終可以在那里修改查詢,好處是邏輯中的所有更改都會自動反映在我們的所有 EXE 實體中,缺點是如果您洗掉或添加列,如果添加必須升級您的 exe 以顯示新列,如果您洗掉或更改列的名稱,您將有一個例外,即修改后的查詢視圖被使用。
uj5u.com熱心網友回復:
我會為每個查詢選擇一個(文本)資源檔案。這使得跟蹤源代碼管理系統中的更改變得更加容易。
在專案目錄中為 SQL 檔案添加一個子檔案夾,并將它們添加到 rc- 檔案中,例如:
SQL1 TEXT .\SQL\SQL1.sql
SQL2 TEXT .\SQL\SQL1.sql
將該 rc 檔案添加到專案中,您可以將 SQL 文本直接加載到 TQuery 的 SQL 成員中,就像
program Project2;
{$APPTYPE CONSOLE}
{$R *.res}
{$R 'SQLQueries.res' 'SQLQueries.rc'}
uses
Windows,
Data.SqlExpr,
Classes;
var
ResourceStream: TResourceStream;
Query: TSQLQuery;
begin
ResourceStream := TResourceStream.Create(HInstance, 'SQL1', 'TEXT');
Query:= TSQLQuery.Create(nil);
try
Query.SQL.LoadFromStream(ResourceStream);
Writeln(Query.SQL.Text);
ReadLn;
finally
Query.Free;
ResourceStream.free;
end;
end.
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/471641.html
