2016-11-27 176 views
1

因此,數據庫hotchpotch。通過VBA在Access前端執行MySQL存儲過程

  • 我有一個存儲過程的MySQL數據庫。
  • 我有一個連接到MySQL數據庫(我可以調查表)的Access文件作爲前端(與形式和東西)
  • 我已經成功創建了一個ODBC通過查詢(我認爲這就是他們是什麼調用)從數據庫調用其中一個存儲過程。在訪問查詢實際上只是CALL myProcName;,給我我希望當我Set Result = CurrentDb.OpenRecordset("myProcName")

把它從VBA的結果是什麼,我想實現如下:

  • 已經在存儲過程需要一個參數的MySQL =>檢查!
  • 讓該存儲過程按預期工作=>在phpMyAdmin中檢查=>檢查!
  • 在Access中保存了一個查詢,該查詢鏈接到此參數存儲過程並給定固定參數值=>檢查! (CALL myProcName('myParameterValue'),我可以調用從VBA,就像我做的unparametric查詢)
  • 必須指定'myParameterValue'每次我執行能力的查詢=>不檢查

我需要以某種方式指定的參數在保存的查詢的SQL定義中添加佔位符,並在VBA中設置該參數。對於VBA部分我有和想法,我會發現相當優雅:

Private Sub ParametricQuery() 
    Dim QDef As QueryDef 
    Set QDef = CurrentDb.QueryDefs("myProcName") 
    QDef.Parameters(*insert parameter name here*) = parameter value 
    Dim Result As Recordset 
    Set Result = QDef.OpenRecordset 

    Do While Not Result.EOF 
    MsgBox Result.Fields(1) 'Display a field from the results 
    Loop 
End Sub 

但我將如何建立我的SQL定義?

PARAMETERS in_param TEXT; 
CALL myProcName(in_param); 

不起作用。如果我嘗試

Set QDef = CurrentDb.QueryDefs("myProcName") 
MsgBox QDef.Parameters.Count 

我得到一個消息框,告訴我有一個總的在我的查詢定義0參數是,這樣是行不通的。

我在網上找到的是很多人通過字符串操作在VBA中構建實際的SQL。這讓我不寒而慄,原因很多(安全性,可維護性和優雅性)。我堅信有一種更好的方式,希望能夠按照我上面所描述的方式。唯一的問題是:如何做到這一點?

+0

你能後的'在MySQL中建立PROCEDURE'線(無需整個PROC)?命名的參數及其類型非常重要。 – Parfait

+0

嗯,我通過myphpadmin中相當不錯的「創建過程」界面創建了程序。它有一個參數方向「IN」(很明顯),類型爲VARCHAR,長度爲254(電子郵件地址的最大長度)。並且該過程做了一個簡單的'SELECT * FROM table WHERE field = param' – lhiapgpeonk

回答

2

考慮使用ADO作爲參數化查詢來調用存儲過程。目前,您正在使用DAO(Access的默認數據庫API)來訪問傳遞查詢(保存的Access querydef)。但是,這種類型的查詢在前端沒有看到任何內容,只有後端RDMS,特別是MySQL SQL方言及其連接的數據庫對象。因此,您不能將本地參數值綁定到它。而PARAMETERS子句只是Access SQL方言的一部分,並且會失敗MySQL語法。

MySQL的存儲過程

CREATE PROCEDURE `mystoredproc`(IN param VARCHAR(254)) 
BEGIN 
    SELECT * FROM table WHERE field=param; 
END 

ADO參數化查詢

Public Sub CallMySQLProc()  
    Dim conn As Object, cmd As Object, rst As Object 
    Const adCmdStoredProc = 4, adParamInput = 1, adVarChar = 200 

    Set conn = CreateObject("ADODB.Connection") 
    Set rst = CreateObject("ADODB.Recordset") 

    ' DSN-LESS CONNECTION 
    conn.Open "Driver={MySQL ODBC 5.3 Unicode Driver};host=hostname;database=databasename;" _ 
       & "UID=username;PWD=****" 

    ' CONFIGURE ADO COMMAND 
    Set cmd = CreateObject("ADODB.Command") 
    With cmd 
     .ActiveConnection = conn 
     .CommandText = "mystoredproc" 
     .CommandType = adCmdStoredProc 
     .CommandTimeout = 15 
    End With 

    ' APPEND NAMED PARAM 
    cmd.Parameters.Append cmd.CreateParameter("param", adVarChar, _ 
               adParamInput, 254, "[email protected]") 
    Set rst = cmd.Execute 

    ' FREE RESOURCES 
    rst.Close 
    Set rst = Nothing 
    Set cmd = Nothing 
    Set conn = Nothing 

End Sub 

DAO動態傳遞查詢

在這裏,你可以動態生成的QueryDef的.SQL聲明,但不會進行參數設置:

Private Sub ParametricQuery() 
    Dim QDef As QueryDef 
    Dim Result As Recordset 

    Set QDef = CurrentDb.QueryDefs("PassThruQ") 
    QDef.SQL = "CALL mystoredproc('[email protected]')" 

    Set Result = QDef.OpenRecordset 

    Do While Not Result.EOF 
    Debug.Print Result.Fields(1) 'Print to immediate window a field from the results 
    Loop 

    Result.close 
    Set Result = Nothing 
    Set QDef = Nothing 
End Sub 
+0

行,所以它不能輕易完成:)。有沒有辦法避免在代碼中給連接字符串? Acces知道如何連接到數據庫,它可以顯示錶格。那麼,爲什麼我需要重新指定密碼並且明顯地爲所有人?動態構建SQL有多安全?我看到了一大堆SQL注入的潛力,我試圖避免。 (希望)做好事情和事情。但迄今爲止感謝! – lhiapgpeonk

+1

只需使用文件[DSN](https://support.microsoft.com/en-us/kb/966849),代碼中不會顯示任何憑據。您可以在ODBC傳遞或外部工具/ ODBC或obdcad32.exe的相同對話框中爲您的MySQL數據庫構建一個(存儲的文本文件)。僅供參考 - ADO可能是VBA運行參數化查詢的唯一方法! – Parfait

+0

只需閱讀DSN上的文章:我已經在窗口的控制面板中將我的數據庫指定爲ODBC數據源,這就是Access知道如何連接到數據庫的位置,因此應該是系統DSN。任何機會,我可以在VBA中使用它?信息是沒有問題的... – lhiapgpeonk