免責聲明:這是遺留代碼,我根本無法重寫所有內容(相信我,我想)。BDE,DB2和TQuery參數
我想執行一個使用BDE和DB2的傳統Delphi應用程序,但我根本無法運行參數化查詢。
QueryA.SQL.Text := 'select count (*) from syscat.tables where tabname = ''Foo''';
QueryA.Open; // works as expected
QueryB.SQL.Text := 'select count (*) from syscat.tables where tabname = :name';
QueryB.ParamByName('name').ParamType := ptInput;
QueryB.ParamByName('name').DataType := ftString;
QueryB.ParamByName('name').AsString := 'Foo';
QueryB.Open; // Error: "Operation not applicable"
QueryC.SQL.Text := 'select count (*) from syscat.tables where tabname = :name';
QueryC.ParamByName('name').ParamType := ptInput;
QueryC.ParamByName('name').DataType := ftString;
QueryC.ParamByName('name').Clear;
QueryC.Open; // Surprisingly, no erros here
現在...爲什麼QueryB示例不起作用?我嘗試了幾乎所有我能想象到的事情:使用Value
而不是AsString
,呼叫Prepare
和UnPrepare
,但似乎沒有任何工作。有任何想法嗎?
重要: - > ODBC - > DB2辦法我直接通過BDE使用BDE conecting和不。
編輯:環境信息:
Delphi Version: 5, UpdatePack 1
BDE: 5.01
OS: Windows 7 SP1, x64
D:\SQLLIB\BIN>db2level
DB21085I Instance "DB2" uses "32" bits and DB2 code release "SQL09052" with
level identifier "03030107".
Informational tokens are "DB2 v9.5.201.346", "s080911", "WR21421", and Fix Pack "2a".
Product is installed at "D:\SQLLIB" with DB2 Copy Name "DB2COPY1".
對不起,可能是一個鈍的問題,但如果QueryA的作品,爲什麼不在運行時簡單地構造Sql.Text並完全避免參數?我似乎記得像你們這樣的問題對BDE來說並不是沒有聽說過的。 – MartynA
@Martyn,通過手動構建帶有數據的查詢來避免參數會導致* SQL注入*漏洞。 –
@MartynA問題是,整個應用程序(這是一個很大的應用程序)依賴於參數......改變所有內容根本不可行...另外,正如Rob Kennedy所說,這是一個巨大的漏洞。 –