您目前已離線,請等候您的網際網路重新連線

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

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本:216873
依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。
徵狀
比較兩個欄位的準則字串的 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 - 最後檢閱時間:08/24/2001 08:40:00 - 修訂: 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
意見反應