2015-10-14 92 views
-4

這是決賽,但已經adoquery過濾器無法過濾
任何人有關於我的過濾問題德爾福與列表框項目

begin 
adoquery1.SQL.CLEAR; 
adoquery1.SQL.Add('select * FROM gunsonu '); 
adoquery1.SQL.Add('where TARIH like :TRH'); 
adoquery1.Parameters.ParamByName('TRH').Value:=(PlannerDatePicker1.text); 

for i := 0 to form3.ListBox1.Items.Count-1 do 
adoquery1.SQL.Add(' and VLIM <> '+QuotedStr(form3.ListBox1.items[i])); 
end; 
adoquery1.Open; 
frxReport1.ShowReport(true); 
+0

當你說'不能'你的意思是你的代碼執行,但adoquery1不返回任何行?最類似的原因是您的列表框項不包含任何'%'通配符。如果沒有,它就像你有'='符號而不是'like'一樣工作。 – MartynA

+0

此外,如果您試圖匹配列表框項目的列是字符列,你應該圍繞「form3.ListBox1.items [i]」由「QuotedStr()」 – MartynA

+0

我嘗試喜歡它,但它已經過濾器是空的: ( 開始 adoquery1.SQL.CLEAR; adoquery1.SQL.Add( 'SELECT * FROM gunsonu '); adoquery1.SQL.Add(' 其中TARIH像:TRH'); adoquery1.Parameters.ParamByName( 'TRH')值:=(PlannerDatePicker1.text); 對於i:= 0至form3.ListBox1.Items.Count-1做 adoquery1.SQL.Add( '和VLIM =' + QuotedStr(form3。ListBox1.items [I])); 結束; adoquery1.Open; frxReport1.ShowReport(true); 結束; –

回答

1

的最佳方式,從對一個MS SQL Server的ISN」 Delphi應用程序設置查詢想法t繼續修改構建查詢的應用程序中的代碼,直到運行它返回您希望的結果。德爾福快速編譯/運行週期的一個問題是它鼓勵嘗試和錯誤,這是無法替代正常工作的替代品。

這是更好的SQL-建設任務從編碼一個分開的原因有兩個:

  1. 在SQL Server客戶端工具(如SQL Server管理Studio或舊ISQL/W「查詢分析器「)是Sql構建任務的更好工具,他們可以訪問服務器的執行計劃,分析器等。但是如果你沒有這些工具之一,那麼多年來,Delphi已經包含某種」數據瀏覽器「工具來運行對各種服務器的查詢 - 在最近的XE版本中,IDE菜單中的FireDac | Explorer下有一個Firedac。

  2. 使用其中一種工具,您可以將Sql查詢實際發送到服務器上,並在您面前的屏幕上。在Delphi代碼中嘗試設置Sql時出現頻繁的錯誤來源,特別是對於初學者來說,發送到服務器的Sql查詢不一定就是您所假設的。通過SO中qs上出現的例子來判斷,它們常常充斥着語法或語義錯誤,特別是當Sql應該包含引號時(Delphi IDE的Watch和Evaluate窗口不提供用於查看Sql的好表單)。在Sql查詢工具中創建查詢,您將有機會準確查看查詢的內容,並從工具獲得有關語法錯誤的反饋等。

  3. 使用這些工具可以更輕鬆地嘗試最佳方式參數化您的查詢。

3是什麼意思?那麼,有一點是,參數化查詢通常比特殊的優化服務器更好,雖然並不是所有的查詢都可以用參數化的形式表達(例如,你不能參數化你要查詢的列或表) 。另一件事是它有助於最大限度地減少您對Sql注入的暴露(見https://en.wikipedia.org/wiki/SQL_injection)。

一旦你的查詢工作正如你所期望的那樣,在上面的客戶端Sql工具中,就是編寫代碼從Delphi應用程序執行它的時間,而不是之前。