所以我有一個AdoTable連接到數據庫(mdb)和使用它的數據源。此數據源由DBGrid使用...合併列上的AdoDB過濾器
我試圖根據用戶輸入過濾AdoTable。有3個重要的欄目:名稱,姓氏和ID。我想出了這樣的事情作爲一個臨時解決方案:
AdoTable.filter:='surname like ' +
QuotedStr('%'+edit1.text+'%')+' or name like ' +
QuotedStr('%'+edit1.text+'%')+' or ID like ' +
QuotedStr('%'+edit1.text+'%');
AdoTable.filtered:=true;
它的工作,但它不會做什麼我想它做的事...(用於名稱搜索時和surename也不會找到任何東西,因爲它只顯示在一列中)。 所以後來我修改了代碼轉換成這樣:
AdoTable.filter:='surname & " " & name like ' +
QuotedStr('%'+edit1.text+'%')+' or name & " " & surname like ' +
QuotedStr('%'+edit1.text+'%')+' or ID like ' +
QuotedStr('%'+edit1.text+'%');
AdoTable.filtered:=true;
現在,這個會做exacly什麼,我想要它做的,但它會引發異常(EOleException:參數的錯誤類型,超出可接受的範圍內,或彼此衝突)。 這讓我感到驚訝,因爲我認爲它應該像sql命令中的where子句那樣工作(並且它完美地作爲命令)。
我試着用'+'取代'&'。 我可以分割一個輸入文本,但我不想這樣做(如果你有像羅賓范佩西,艾哈邁德ibn漢巴爾等名稱,它會工作很差。)
或者我可以重寫整個程序使用查詢,而不是表,但我不想這樣做(這也意味着我會得到新的記錄集EVERYTIME用戶將更改edit1.text而不是隻是過濾)。
任何想法?
編輯: 這樣命令的作品看起來像這樣
select * from person where surname & " " & name like '%John Smith%' or name & " " & surname like '%John Smith%' or ID like '%John Smith%'
過濾器看起來像這樣(和它引發的異常)
surname & " " & name like '%John Smith%' or name & " " & surname like '%John Smith%' or ID like '%John Smith%'
注意,有可能是「HN史密斯」,而不是'約翰史密斯',所以它會發現'卡恩史密瑟斯'等
還有一些未知的部分: 什麼類型是ID?你的代碼假設它是一個聽起來不正確的字符串,大多數ID是一個數字。 第二:你的數據庫是什麼?當你使用例如SQL Express'%'是正確的,當您使用Access時,您必須使用'*' 您能顯示生成的過濾器字符串嗎? –
ID確實是字符串。它可以是'123abc'之類的東西。我在網上發現,Access使用'%'('*'不起作用)。因此,如果我們的過濾器是'姓氏&'「&名稱,如''%John Smith%''或姓名'」&姓氏如''John Smith%''或ID如''John Smith%'''如果我們正在搜索名字和姓氏或'姓氏'「&名稱,如''%0123abcd%''或姓名'」&姓氏如''%0123abcd%''或ID如''%0123abcd%'''正在搜索ID –
請發佈您的解決方案回答 – kobik