PRB: 錯誤 3001 比較欄位做為準則來篩選資料錄集

文章翻譯 文章翻譯
文章編號: 216873 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

徵狀

比較兩個欄位的準則字串的 ADO 篩選屬性中 (例如: 的準則字串組成表單中的子句: FieldName 操作員 FieldName) 會產生下列錯誤:
執行階段錯誤 '3001':
應用程式所使用的是錯誤的型別、 超出可接受的範圍,或是在另一個與衝突的引數。

發生的原因

目前的 ADO 版本無法來完成這項功能。ADO 篩選屬性的條件語法定義如下:
「 FieldName 運算子 'Literal_Value' 」
'Literal_Value' 資料類型可以是字串、 數字或日期。您無法使用先前的運算式來比較兩個欄位。嘗試執行這項操作,會引發錯誤 3001。

解決方案

一個解決方法是有數個聯結的布林運算子做為篩選準則的運算式。您只能使用這個 if 比較欄位的值已知開發人員。如此一來,開發人員可以隨附準則字串,符合所需的結果的公式。例如:
rs.Filter = "Field1 Operator1 'Value1' AND Field2 Operator2 'Value2'"
				

如果開發人員並不知道值 Field1 和 Field2,開發人員有使用自訂的篩選常式,在用戶端應用程式) 中或預存程序 (在伺服器端) 來動態地完成功能。您可以使用自訂的篩選常式 (或預存程序) 來執行必要的欄位比較,並產生預期的結果內的控制流程陳述式。

本文提供這類常式本文 < 更多資訊資訊 > 一節中的示範。

警告: 更多資訊資訊] 區段中所提供的解決方法是只提供給圖例用途不包括但不是限於,任何提供任何明示或默示的保證,適售性以及適合某特定用途之默示擔保責任。

狀況說明

Microsoft 已確認這是在本文開頭所列之 Microsoft 產品中的問題。

其他相關資訊

說明 ADO 文件中聲明篩選方法的準則運算式--在 < 備註 > 下下列:

準則字串組成子句在表單中 FieldName-運算子-值 (比方說 「 姓氏在前 = 'Smith'")。您可以串連與個別子句來建立複合子句 AND (,例如"[姓氏] = 'Smith' AND 名字在前 = 'John'") 或 OR (,例如"[姓氏] = '姓氏在前] 或 [姓氏] = 'Jones'")。

它也會指出的準則值的下列方針:

值是與您會比較欄位值的值 (比方說 'Smith',# 8/24/95 # 12.345 或 $ 50.00)。使用單引號有字串及日期的井字號 (#)。對於數字,您可以使用十進位小數點、 錢幣符號和科學標記法。 如果運算子是 LIKE 值可以使用萬用字元。只有星號 (*) 和百分比符號 (%) 允許萬用字元,而且必須要在字串中的最後一個字元。數值不可是 Null。
重製行為的步驟
===========================

  1. 啟動新的 Microsoft Visual Basic 專案。預設會建立 Form1。
  2. 設定到 Microsoft ActiveX 資料物件 2.x 檔案庫的專案參考。
  3. 插入表單上的命令按鈕。依預設建立 Command1。
  4. Form1 的一般宣告區段中插入下列程式碼:
   Option Explicit
   Dim cn As New ADODB.Connection
   Dim rs As New ADODB.Recordset

   Private Sub Command1_Click()
       cn.Open "provider=SQLOLEDB;Data Source=<your data source>;User ID=<uid>;" _ 
    "password=;Initial Catalog=pubs;"
       On Error Resume Next
       cn.Execute "drop table tblFilterTest"
       On Error GoTo errh
       ' Create the test table
       cn.Execute "create table tblFilterTest(ID int primary key, Field1  
    varchar(20), Field2 varchar(20))"
       ' Open ADO recordset
       rs.Open "select * from tblFilterTest", cn, adOpenKeyset, 
    adLockOptimistic
       ' Add first record
       rs.AddNew
       rs("ID") = 1
       rs("Field1") = "A"
       rs("Field2") = "B"
       rs.Update
       rs.Requery
   
       ' Add 2nd record
       rs.AddNew
       rs("ID") = 2
       rs("Field1") = "D"
       rs("Field2") = "C"
       rs.Update
       rs.Requery
    
       ' Print original recordset
       Debug.Print "Original Recordset:"
       Debug.Print "====================="

       While Not rs.EOF
            Debug.Print rs("Field1") & vbTab & rs("Field2") 
             rs.MoveNext
       Wend

       rs.MoveFirst

       ' You get error 3001 on the following line
       rs.Filter = " Field1 > Field2 "

       ' To demonstrate the workaround, comment the preceding line and
       ' uncomment the following line:

       ' Call Filter
       Exit Sub

   errh:
       Debug.Print "Error Number:", Err.Number
       Debug.Print "Error Source:", Err.Source
       Debug.Print "Error Description:", Err.Description
   End Sub

   Private Sub Filter()
       Debug.Print "Filtered Recordset: "
       Debug.Print "====================="
    
       While Not rs.EOF
         If rs("Field1") > rs("Field2") Then
             Debug.Print rs("Field1") & vbTab & rs("Field2") 
         End If
         rs.MoveNext
       Wend
   End Sub
				
按下 F5 執行專案和錯誤 3001,就會發生。

?考

如需詳細資訊,請參閱 ADO [說明] 文件。
如需詳細資訊請參閱 「 Microsoft 知識庫 」 中下列文:
195222PRB: ADO Find 方法只支援一個準則

屬性

文章編號: 216873 - 上次校閱: 2001年8月24日 - 版次: 1.0
這篇文章中的資訊適用於:
  • Microsoft ActiveX Data Objects 2.0
  • Microsoft ActiveX Data Objects 2.01
  • Microsoft ActiveX Data Objects 2.1
  • Microsoft ActiveX Data Objects 2.1 Service Pack 2
  • Microsoft ActiveX Data Objects 2.5
  • Microsoft ActiveX Data Objects 2.6
  • Microsoft ActiveX Data Objects 2.7
關鍵字:?
kbmt kbcode kbdatabase kbfix kbprb KB216873 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:216873
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com