<output id="os3gq"><ruby id="os3gq"></ruby></output>

    1. <mark id="os3gq"></mark>
    2. VBA易用化研究院:混元神功之統一VBA中SQL語句執行的方法-紅塵如煙
      Access軟件網QQ交流學習群(群號碼198465573),歡迎您的加入!
      首頁 >技術文章> Access數據庫-模塊/函數/VBA


      VBA易用化研究院:混元神功之統一VBA中SQL語句執行的方法

      發表時間:2019/1/29 15:00:11 評論(9) 瀏覽(10194)  評論 | 加入收藏 | 復制
         
      摘 要:統一VBA中SQL語句執行的方法DoCmd.RunSQL、CurrentDb.Execute、CurrentProject.Connection.Execute
      正 文:
      要在 Access 中用 VBA 中執行操作查詢,在不創建查詢對象的前提下,一般主要有3種方法:

      1. Access本身的方法:DoCmd.RunSQL strSQL
      2. DAO的方法:CurrentDb.Execute strSQL
      3. ADO的方法:CurrentProject.Connection.Execute strSQL

      DoCmd.RunSQL 方法

      DoCmd.RunSQL 方法是Access本身的方法,理論上它是首先方式,因為它有進度條,還會有確認消息框,在查詢對象中使用的“Forms!窗體名!控件名”這樣的變量它也能支持。但是當我們用代碼去執行的時候,我們都很確定自己是要干什么的,所以這個時候完全不想讓它顯示確認消息框。那么就只好在執行前關閉確認消息框了,示例代碼如下 :

      DoCmd.SetWarnings False
      DoCmd.RunSQL strSQL
      DoCmd.SetWarnings True

      從上面的示例代碼中我們可以看出,每次調用 DoCmd.RunSQL 之前,都要用 DoCmd.SetWarnings False 關閉系統確認消息框,執行完之后再用  DoCmd.SetWarnings True 恢復系統確認消息框。使用的地方多了,就顯得非常繁瑣。

      這里可能有童鞋會問,讓系統確認消息框一直處于關閉狀態,不就可以不用每次都關閉再開啟這么麻煩了嗎?理論上是可以這樣干,但是,系統確認消息框不單是執行查詢語句的時候用,它是全局性的,一直處于關閉狀態,意味著如果你不小心誤操作刪除了某個表、查詢、窗體、報表等,不會有提示,你修改設計發現不對想關閉不保存重新來過,沒門兒,關閉時自動保存了,不會有確認提示。所以,我是強烈不建議你一直關閉系統確認消息框的。


      CurrentDb.Execute 方法

      相比來說 DAO 的 CurrentDb.Execute  不支持“Forms!窗體名!控件名”變量,功能上要比 DoCmd.RunSQL 弱很多,但是架不住它簡單省事。沒有任何提示消息框,代碼也相對簡短。于是它變成了很多人使用最多的方法了,


      CurrentProject.Connection.Execute 方法

      ADO 的 CurentProject.Connection.Execute 方法可能用得人就少了,無它,太長了,不夠簡短。用上一次兩次還好,當你要幾百幾千次的使用時,不知道要多敲多少次鍵盤,而這種時候你會覺得多敲一個字符都累人。


      但是該方法有一點另外2種方法無法代替:使用SQL語句創建小數類型(decimal)的字段。只有 ADO 的這個方法能正確執行,用另外兩種方式會報錯:


      這是因為小數類型在早期的Access版本中是沒有的,是后期版本才加入的,而DoCmd.RunSQL 和 CurrentDb.Execute 是Access一開始就有的東西,但這里又沒有同樣更新增加對小數類型的支持。而ADO則是DAO之后新一代的數據接口,它是出現在小數類型之后的,所以它可以支持小數類型。


      綜合上面一些信息,我們可以得到這樣一個對比結果:

      方法 執行時不會有確認消息框 生成表查詢自動覆蓋已有的表 支持“Forms!窗體名!控件名”變量語法 支持創建小數類型字段
      DoCmd.RunSQL
      CurrentDb.Execute
      CurrentProject.Connection.Execute

      通過上面的對比可以看出,3種方法各自都有其它方法無法代替的有用特性。于是大家在編寫VBA代碼時,3種方法夾雜使用,一會兒是 DoCmd.RunSQL strSQL, 一會兒又是 CurrentDb.Execute strSQL,看上去就顯得很混亂無序。同時也容易給初學者造成困惑,增加學習難度,搞不清為什么一會兒用這個方法,一會兒用那個方法。

      對于這個問題,本公子思考了很久,面壁九九八十一日,終于悟得了此門混元神功。

      法門就是,創建一個通用的自定義函數,自動根據SQL語句,判斷用哪種方法。這樣就可以在所有執行SQL語句的地方,使用同一個方法,而不必為需要不停變臉而煩惱。

      函數源碼如下:


      '========================================================================================
      '函數名稱: ClientRunSQL
      '功能描述:  整合執行SQL語句的3種方法: DoCmd.RunSQL、CurrentDb.Execute
      '          CurrentProject.Connection.Execute,讓代碼統一標準化,使用更簡單方便。
      '輸入參數: SQLStatement 可以是單個SQL語句字串,也可以是包含多個SQL語句的數組或Collection集合。
      '返回參數: 無
      '相關調用:
      '使用注意:
      '兼 容 性:
      '參考資料:
      '作  者: 紅塵如煙
      '創建時間: 2018-12-21
      '========================================================================================
      Public Function ClientRunSQL _
          ( _
                ByVal SQLStatement As Variant _
          )
          
          On Error GoTo ErrorHandler
      
          If varType(SQLStatement) = vbString Then
              SQLStatement = Array(SQLStatement)
          End If
          
          Dim strExecutor As String
          
          Dim varItem As Variant
          For Each varItem In SQLStatement
              If varItem Like "*Select *INTO *FROM *" Then
                  strExecutor = "DoCmd"
              ElseIf varItem Like "*Forms!*!*" Then
                  strExecutor = "DoCmd"
              ElseIf varItem Like "* COLUMN * DECIMAL(*,*)*" Then
                  strExecutor = "ADO"
              Else
                  strExecutor = "DAO"
              End If
          Next
          
          If strExecutor = "DoCmd" Then
              DoCmd.SetWarnings False
          End If
      
          For Each varItem In SQLStatement
              Select Case strExecutor
              Case "DoCmd": ClientRunSQL CStr(varItem)
              Case "DAO":   CurrentDb.Execute CStr(varItem)
              Case "ADO":   CurrentProject.Connection.Execute CStr(varItem)
              End Select
          Next
          
          If strExecutor = "DoCmd" Then
              DoCmd.SetWarnings True
          End If
          
      ExitHere:
          Exit Function
          
      ErrorHandler:
          MsgBox Err.Description, vbCritical, "Error #" & Err
          Resume ExitHere
      End Function
      
      
      '示例代碼1: 執行單個語句
      Sub Test1()
          ClientRunSQL "Delete FROM 表1"
      End Sub
      
      
      '示例代碼2: 執行多個語句
      Sub Test2()
          Dim colSQLs As New Collection
          With colSQLs
              .Add "Delete FROM 表1"
              .Add "Delete FROM 表2"
              .Add "Delete FROM 表3"
              .Add "Delete FROM 表4"
          End With
          ClientRunSQL colSQLs
          Set colSQLs = Nothing
      End Sub
      好了,少年,這本如來神掌……不好意思,拿錯道具了……這本混元神功已經傳授給你了。能不能修成正法,就看你的資質了!



      文末彩蛋:這里函數名為什么是 ClientRunSQL 呢?沒錯,你猜對了,那是因為另外還有一個 ServerRunSQL!但那又是另一個故事了。

      江湖路遠,夜黑坑深,有緣再……!哪個缺德鬼又在這兒挖了一個坑!



      Access軟件網交流QQ群(群號:198465573)
       
       相關文章
      簡單易用功能強大的OFFICE Ribbons 所見即所得作軟件  【一鳴  2009/8/16】
      CurrentDb().Execute strSql與DoCmd....  【紅塵如煙  2013/9/3】
      CurrentDb.Properties ("AppTitle")...  【紅塵如煙  2014/5/8】
      VBA易用化研究院:如何在VBA中編寫含有變量的SQL語句而不易出...  【紅塵如煙  2017/3/10】
      在Access快速開發平臺中調用SqlServer存儲過程優化性能...  【紅塵如煙  2017/10/20】
      【Access源碼】巧妙判斷操作系統和Office是32位還是64...  【紅塵如煙  2019/1/17】
       
       訪客評論
      2019/2/2AngelHis
      期待 ServerRunSQL 的故事。

      2019/1/30藍橋
      論壇搞個點贊塞,1金幣一個贊 :)

      2019/1/30麥田
      nice

      總記錄:3篇  頁次:1/1 9 1 :
       
       發表評論
      評論內容 (必填)

      常見問答
      技術分類
      相關資源
      文章搜索
      關于作者

      紅塵如煙

      文章分類

      文章存檔

      友情鏈接
       
         
      湖北11选5