none
VB.NET 連結Access資料庫,查詢語法疑問 RRS feed

  • 問題

  • 利用ADO中的Recordset.filter功能,進行篩選的程序,

    原本是希望能夠篩選出"01"為字尾的數據,如下方code顯示

    已先連結好Access資料庫連線

    conn.Open(connstr)

    rs.CursorLocation = ADODB.CursorLocationEnum.adUseServer

    rs.Open("Pat_Tresult_Fail_six", conn, ADODB.CursorTypeEnum.adOpenKeyset, ADODB.LockTypeEnum.adLockOptimistic)

    rs.MoveFirst()

    rs.Filter = "(DLCNO Like '*01')"

    結果在執行時,發生引數類型的錯誤,但卻可以搜尋字頭為01,如 01*

    想請問各位高手,問題是出在哪??

    軟體使用Visual Studio 2005,電腦系統為WIN7。

    2014年1月21日 上午 10:39

解答

  • 既然你的開發環境是 .NET , 為什麼不用 ADO.NET 卻要用 ADO ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 Stanley077 2014年1月22日 上午 08:42
    2014年1月21日 下午 01:00
    版主
  • ADO 是設計給 VB 5/6 那個年代,以 MFC / oleaut32.dll 用的。

    ADO.NET 是設計給 .Net 用的。

    .Net 的記憶體模型與 oleaut32.dll 那個年代不同,微軟迄今為止並未完整公開。

    實值型別影響不大,參考型別容易出問題。

    比如說 VB6 支援 ADO 的 Recordset ,但在 VBNET 是ADO.NET 的 DataTable

    此外,VBNET 所有 ADO 專用的自動感知均不支援,只支援 ADO.NET 的。

    如果只是把 Access 資料轉換到 excel ,只需要透過 oledb 跑 in 子句。

    可以看這幾篇:

    In 子句的使用範例

    .Net 學習 Access 資料庫的基礎測試


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 Stanley077 2014年1月22日 下午 02:24
    2014年1月22日 下午 01:18

所有回覆

  • 您可以參考這篇文件的範例:ADO Filter Property

    2014年1月21日 下午 12:26
  • 既然你的開發環境是 .NET , 為什麼不用 ADO.NET 卻要用 ADO ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 Stanley077 2014年1月22日 上午 08:42
    2014年1月21日 下午 01:00
    版主
  • 不要在 .Net 裡面使用 ADO 。

    ADO 線上手冊有:

    Filter 屬性

         

    指定Recordset內資料的過濾器。

    設定值和傳回值

    設定或傳回 Variant 值,它可以包含下列其中之一:

    • 準則字串 — 由一或多個個別子句,並且用 ANDOR運算子所組成的字串。
    • 書籤陣列 — 指向 Recordset 物件內記錄的唯一書籤值陣列。
    • 下列 FilterGroupEnum 值其中一個。
      常數 說明
      adFilterNone 移除目前的過濾器以及回復所有記錄來檢視。
      adFilterPendingRecords 允許您只檢視已經變更,但尚未傳送到伺服器的記錄。只適用於批次更新模式。
      adFilterAffectedRecords 允許您只檢視上次 Delete, ResyncUpdateBatch,或CancelBatch呼叫所影響的記錄。
      adFilterFetchedRecords 允許您檢視目前快取記憶體內的記錄 -- 也就是指上次呼叫時,所取得資料庫記錄的結果。
      adFilterConflictingRecords 允許您檢視造成上次批次更新失敗的記錄。

    備註

    請使用 Filter 屬性來選擇性過濾 Recordset 物件的記錄。過濾的Recordset
    會變成目前的指標。這樣會影響其它屬性,例如AbsolutePositionAbsolutePageRecordCount,以及哪些以目前指標為基礎而傳回數值的 PageCount,原因在於將 Filter
    屬性設定成特定的值,會將目前的記錄移至最新值的第一筆記錄。

    準則是由子句組成的,格式為 FieldName-Operator-Value (例如, "LastName =
    'Smith'")。您可以使用AND結合個別的子句 (例如,"LastName = 'Smith' AND FirstName = 'John'") 或
    OR (例如,"LastName = 'Smith' OR LastName =
    'Jones'"),就可以建立複合子句。請將下列綱領應用於準則字串:

    • FieldName必須是 Recordset
      的有效欄位名稱。若欄位名稱包括空白,您必須將名稱括在方括號內。
    • Operator必須是下列其中之一:<、>、<=、>=、<>、=,或LIKE
    • Value是您會用於比較欄位的值,例如 'Smith'、#8/24/95#、12.345或
      $50.00)。請在字串使用單引號而在日期加上井字號 (#)。至於數字方面,您可以使用小數點、錢號,以及科學記號。若Operator
      LIKE,Value可以是萬用字元。只允許使用星號 (*) 和百分比符號 (%)
      萬用字元,而且它們必須是字串內最後的字元。Value不可以為Null (空值)。
    • AND OR 之間沒有先行計算。子句可以放在括弧內。不過您不可以使用 OR
      將子句組成群組,然後使用 AND 將該群組與其它群組一起結合,例如:
      (LastName = 'Smith' OR LastName = 'Jones') AND FirstName = 'John'
    
    
    • 您反而應該按照下列方式,設定此過濾器的結構
      (LastName = 'Smith' AND FirstName = 'John') OR (LastName = 'Jones' AND FirstName = 'John')
    
    
    • LIKE字句中,您可以在樣式的開頭結尾使用萬用字元 (例如 LastName Like
      '*mit*'),或者只在樣式的結尾使用萬用字元 (例如,LastName Like 'Smit*')。

    過濾器常數可以讓您檢視上次 UpdateBatch
    方法呼叫時影響到的記錄,方便您解決批次更新模式下,個別的記錄衝突。

    設定 Filter屬性本身可能會失敗,原因在於與相依資料的衝突
    (例如已經被其它使用者刪除的記錄);在這種狀況下,提供者會傳回警告至 Errors集合物件,但是不會停止程式的執行。執行時間 (run-time)
    錯誤只會在所有要求之記錄都產生衝突的時候才會發生。請使用 Status
    屬性來尋找衝突的記錄。

    Filter屬性設定成0長度字串 ("") 與使用 adFilterNone常數,作用是相同的。

    任何時候設定
    Filter屬性的時候,目前的記錄位置會移至Recordset內過濾之記錄子集合物件的第一筆記錄。同樣地,清除
    Filter屬性的時候,目前的記錄會移至 Recordset 的第一筆記錄。

    如需建立陣列來使用Filter屬性時可以使用的書籤值說明,請參閱Bookmark屬性。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2014年1月21日 下午 01:13
  • 可以請問大大是為什麼嗎? 小弟剛碰這軟體設計,不是很清楚他的分類,原本想說利用VBA的寫法進去寫的
    2014年1月22日 上午 01:20
  • 請問一下 ADO.NET 跟我只用ADO 有什麼差別嗎?

    是語法不同嗎?

    當初只是想利用ADO的物件去完成我連結ACCESS資料庫的運作,其實不是很清楚這方面的問題

    2014年1月22日 上午 01:23
  • ADO.NET for the ADO Programmer

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2014年1月22日 上午 05:54
    版主
  • 已經有稍微了解下ADO.NET,因為目前製作的需求僅是將TXT匯入進去ACCESS資料庫內,

    再將資料庫內的數據製作成Excel的結果,

    這樣的話仍需要用ADO.NET的部分嗎?

    可以單純只使用ADO的物件進行存取的功能嗎?

    2014年1月22日 上午 10:40
  • ADO 是設計給 VB 5/6 那個年代,以 MFC / oleaut32.dll 用的。

    ADO.NET 是設計給 .Net 用的。

    .Net 的記憶體模型與 oleaut32.dll 那個年代不同,微軟迄今為止並未完整公開。

    實值型別影響不大,參考型別容易出問題。

    比如說 VB6 支援 ADO 的 Recordset ,但在 VBNET 是ADO.NET 的 DataTable

    此外,VBNET 所有 ADO 專用的自動感知均不支援,只支援 ADO.NET 的。

    如果只是把 Access 資料轉換到 excel ,只需要透過 oledb 跑 in 子句。

    可以看這幾篇:

    In 子句的使用範例

    .Net 學習 Access 資料庫的基礎測試


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 Stanley077 2014年1月22日 下午 02:24
    2014年1月22日 下午 01:18