我正在爲我的sql表創建一個搜索過濾器,我希望能夠搜索表的所有字段並返回包含我輸入的文本的記錄。我有多個表,所以硬編碼到我的聲明中的所有字段不是一個選項。這個方法我試過(見代碼片段),但我收到此錯誤:搜索sql表的所有字段時出現語法錯誤
class EOIeException with message 'Syntax error (missing operator) in query expression '(fieldContent LIKE '%SearchStr%') OR (fieldContent LIKE '%SearchStr%') OR ''. Process stopped.
通常語法錯誤很容易解決,但我沒有與這一個線索。希望你能幫助。謝謝。順便說一句,fieldContent和SearchStr只是實際內容的表示。
qryInfo.SQL.Clear;
qryInfo.SQL.Add('SELECT * FROM ' + tableName);
qryInfo.Open;
tblInfo.SQL.Clear;
tblInfo.SQL.Add('SELECT * FROM ' + tableName);
tblInfo.SQL.Add('WHERE (' + qryInfo.Fields[0].AsString + ' LIKE ' + QuotedStr('%' + edtSearch.Text + '%') + ')');
for i:= 1 to qryInfo.FieldCount - 1 do
begin
tblInfo.SQL.Add(' OR (' + qryInfo.Fields[i].AsString + ' LIKE ' + QuotedStr('%' + edtSearch.Text + '%') + ')');
end;
tblInfo.Open;
tblInfo.Open之前把ShowMessage(tblInfo.Text)當我
SELECT * FROM tblGymnast
WHERE (EG000002 LIKE '%S%')
OR (Erasmus LIKE '%S%')
OR (Petrus LIKE '%S%')
OR (Peter LIKE '%S%')
OR (EF000001 LIKE '%S%')
OR (2 LIKE '%S%')
OR (0832133123 LIKE '%S%')
OR (SFEW33FWX LIKE '%S%')
OR (- LIKE '%S%')
OR (2016/03/08 LIKE '%S%')
OR (1996-08-19 LIKE '%S%')
OR (M LIKE '%S%')
OR (Afrikaans LIKE '%S%')
OR (White LIKE '%S%')
OR (Trampoline LIKE '%S%')
OR (1908966000234 LIKE '%S%')
OR (EL000004 LIKE '%S%')
OR (ES000002 LIKE '%S%')
OR (EL000003 LIKE '%S%')
OR (TR000002 LIKE '%S%')
OR (ED000001 LIKE '%S%')
OR (234567890 LIKE '%S%')
OR (EM000001 LIKE '%S%')
就在'tblInfo.Open;'之前,添加'ShowMessage(tblInfo.SQL.Text);'看看你是否能得到你所期望的。另外,對SQL注入進行一些研究 - 通過使用unsanitized用戶輸入來連接SQL,您已經讓自己變得更加開放。 [小巴比表](http://littlebobbytables.com)會愛你。 –
嗨,肯我編輯我的問題與ShowMessage(tblInfo.SQL.Text)的結果。它發出了正確的結果。另外,封裝在QoutedStr()中的字符串是否仍然會對SQL注入造成負面影響? @KenWhite –
是的,封裝在QuotedStr()中的字符串非常容易受到SQL注入的攻擊。你讀過我給你的鏈接了嗎?你的SQL不是*發出正確的結果*。我看到您添加的SQL至少有6個問題 - 「2」,「0832133123」,「-',」2016-03/08「和」1996-08-19「,」1908966000234「和」234567890「分別是在我遇到過的任何SQL方言中沒有有效的列名稱。如果你的SQL不能在管理工具中執行,你可以運行它進行測試,它也不會在你的Delphi應用程序中運行。 –