2016-08-05 57 views
0

當我嘗試搜索這兩列,沒有過濾器。我想在dbgrid中列出5和30.05.2016。德爾福sql搜索列和列

adoquery1.Close; 
adoquery1.SQL.CLEAR; 
adoquery1.SQL.Add('select * FROM Sheet11 '); 
adoquery1.SQL.Add('where field9 like :blm and field12 like :blm1'); 
adoquery1.Parameters.ParamByName('blm').Value:='5'; 
adoquery1.Parameters.ParamByName('blm1').Value:='30.05.2016'; 
adoquery1.Open; 
+0

什麼是'field9'的類型? – Sami

回答

1

那麼究竟是什麼問題呢? 使用參數是對的,最好不要使用由於各種脆弱性和意想不到的副作用而產生的字符串拼接 - http://bobby-tables.com

並使用正確的數據類型!

adoquery1.SQL.Text := 'select * FROM Sheet11 ' + 
         'where (field9 = :_p_field9) ' + 
         ' and (field12 = :_p_field12)'; 
with adoquery1.Parameters do begin 
    ParamByName('_p_field9').AsInteger := 5; 
    ParamByName('_p_field12').AsDateTime := EncodeDate(2016, 05, 30); 
end; 
adoquery1.Open; 
+0

這是比我的更好的解決方案(現在刪除)。 – Dsm

+0

@Dsm很好,也許是,也許不是。我仍然沒有得到什麼,甚至是這裏的問題?.. –

+0

以及你的解決方案肯定比我的更好。至於什麼是問題 - 我 - 我不是SQL的專家,但不需要用引號包圍日期字段?我希望原始查詢生成「select * from sheet11 where field9 like 5 and field 10 like 30.05.2016」。但也許我錯了... – Dsm

1

你有一個很不好的SQL錯誤。 LIKE不適用於字符串以外的任何類型(CHAR,VARCHAR等)。它不適用於數字或日期。如果您需要兩個值之間的某個值,則您正在尋找=,而不是尋找完全匹配,或尋找BETWEEN

這應該爲你工作:

adoquery1.Close; 
    adoquery1.SQL.CLEAR; 
    adoquery1.SQL.Add('select * FROM Sheet11 '); 
    adoquery1.SQL.Add('where field9 = :blm and field12 = :blm1'); 
    adoquery1.Parameters.ParamByName('blm').Value:= 5; // Notice no quotes 
    adoquery1.Parameters.ParamByName('blm1').Value:= '2016-05-30'; // Note no extra quotes 
    adoquery1.Open;