2013-08-21 38 views
0

免責聲明:這是遺留代碼,我根本無法重寫所有內容(相信我,我想)。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,呼叫PrepareUnPrepare,但似乎沒有任何工作。有任何想法嗎?

重要: - > 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". 
+0

對不起,可能是一個鈍的問題,但如果QueryA的作品,爲什麼不在運行時簡單地構造Sql.Text並完全避免參數?我似乎記得像你們這樣的問題對BDE來說並不是沒有聽說過的。 – MartynA

+0

@Martyn,通過手動構建帶有數據的查詢來避免參數會導致* SQL注入*漏洞。 –

+0

@MartynA問題是,整個應用程序(這是一個很大的應用程序)依賴於參數......改變所有內容根本不可行...另外,正如Rob Kennedy所說,這是一個巨大的漏洞。 –

回答

0

好吧,看起來像這個問題沒有解決方案。作爲@TOndrej和@DavidG的指針,this QC issue從未解決,似乎沒有人知道如何解決它。

就我而言,我會放棄並告知上級,除非我們重寫應用程序,否則我們不再支持DB2。無論如何,感謝所有試圖幫助我的人。

0

我會嘗試檢查和或更換PARAMS使用TQuery.Params。例如,您可以調用TQuery.Params.Clear來刪除所有參數,然後調用TQuery.Params.CreateParam創建一個參數並查看它是否有效,以及您得到的是什麼類型的消息。或者,您可以使用自動參數創建,並檢查TQuery.Params.Items的屬性。

此外,爲了幫助解決這個問題,您可以嘗試用*替換count(*)或其中一個字段的名稱以查看是否是問題的一部分。

+0

試圖手動創建參數,但沒有運氣...看起來像沒有解決方案對於這一個:( –

1

德爾福7有一個缺陷報告http://qc.embarcadero.com/wc/qcmain.aspx?d=12905,似乎幾乎相同。我唯一的想法就是如果用一個問號替換:name,會發生什麼情況。「?」在db2 Java參數中使用?您將需要使用參數作爲位置

+0

好主意!不幸的是,不起作用。試了兩個'?'(手動創建參數)和':?',仍然是同樣的錯誤。 –

+0

老鼠對不起,它沒有工作 – DavidG

+0

?在其他語言(C系列和Java?)中使用,Delphi一直使用:來表示參數。 –

0

未使用BDE,但通過ADO查詢,參數類型信息應由數據庫填充。只有在連接字符串已設置的情況下(直接或通過TADOConnection對象),纔會發生這種情況。嘗試刪除ParamType和DataType調用,並確保連接已被設置。