【问题标题】:mySQL, Excel, VBA and ADODB (command) trouble with parametersmySQL、Excel、VBA 和 ADODB(命令)参数问题
【发布时间】:2021-06-06 11:14:47
【问题描述】:

我有一个包含用户数据的数据库 (localhost)。我使用 mySQL。 我想使用 Excelsheet 更新这些数据。我写了一些 VBA 代码。我已经查看了this solution: adodb trouble with parameters and vba,但这对我不起作用。

我制作了一个 VBA 宏并进行了一些测试。该宏仅适用于“普通”SQL 字符串。 我在代码中加入了不同的测试和错误。我无法弄清楚我做错了什么。 我已经用 Google 搜索了不同的错误,但我找不到足够的信息

[MySQL][ODBC 8.0(w) 驱动程序][mysqld-5.5.5-10.4.14-MariaDB] 参数类型无效

我检查了数据库和列 (varChar) 的值类型设置,看起来 (?) 没问题。 有人可以帮我吗? 最好的祝福 M.

Sub Addres_to_Database_2_Update()
'Update an MySQL database (database: samueldb, table: users) on localhost
'with data form an excel sheet called "Testblad"

Dim Connect As ADODB.Connection
Dim sqlQuery As String

Dim user_id As String
Dim firstname As String
Dim lastname As String
Dim address As String
Dim contact As String

user_id = Sheets("Testblad").Range("B6").Value
firstname = Sheets("Testblad").Range("B7").Value
lastname = Sheets("Testblad").Range("B8").Value
address = Sheets("Testblad").Range("B9").Value
contact = CStr(Sheets("Testblad").Range("B10").Value)

MsgBox "Data: " & user_id & " " & firstname & " " & lastname & " " & address & " " & contact

Set Connect = New ADODB.Connection
Connect.Open "DRIVER= {MySQL ODBC 8.0 Unicode Driver}; SERVER=localhost;DATABASE=samueldb;USER=root;    PASSWORD=;"
'password is empty

'This normal SQL string works fine
'sqlQuery = "UPDATE users " & _
'                 "SET FirstName = '" & firstname & "', " & _
'                 "LastName = '" & lastname & "', " & _
'                 "address = '" & address & "', " & _
'                 "contact = '" & contact & "' WHERE user_id= " & user_id & " "

Debug.Print sqlQuery
'Result: UPDATE users SET FirstName = 'Henkie', LastName = 'Strijbos', address = 'Amsterdam', contact     = '35673567' WHERE user_id= 23
'Result = OK
'Database will be Updated when SQL is executed

'=== But: testing with parameters does not work
'see: https://stackoverflow.com/questions/43679797

sqlQuery = "UPDATE users " & _
                "SET firstname = ?firstname, " & _
                "lastname = ?lastname, " & _
                "address = ?address, " & _
                "contact = ?contact " & _
                 "WHERE user_id = user_id"
Debug.Print sqlQuery
'Result when debugged > UPDATE users SET firstname = ?firstname, lastname = ?lastname, address = ?address, contact = ?contact WHERE user_id = user_id
'Result = OK


With New ADODB.command
    .ActiveConnection = Connect
    .CommandType = adCmdText
    .NamedParameters = True
    .CommandText = sqlQuery
    
' ========== Test 1   > Run-time error '3708':
'
 '   .Parameters.Append .CreateParameter("?firstname", , adParamInput, , firstname)
'RESULT: Run-time error '3708':Parameter Object is improperly defined. Inconsistent or incomplete information was provided
' code stops her
 '  .Parameters.Append .CreateParameter("?lastnamer", , adParamInput, , lastname)
'   .Parameters.Append .CreateParameter("?address", , adParamInput, , address)
'   .Parameters.Append .CreateParameter("?contact", , adParamInput, , contact)

'========== Test 2 This does not work, same failure  > Run-time error '3708':
'
'   .Parameters.Append .CreateParameter("?firstname", , , , firstname)
'RESULT: Run-time error '3708':Parameter Object is improperly defined. Inconsistent or incomplete information was provided
' code stops her
'    .Parameters.Append .CreateParameter("?lastnamer", , , , lastname)
'    .Parameters.Append .CreateParameter("?address", , , , address)
'    .Parameters.Append .CreateParameter("?contact", , , , contact)

 '========== Test 3 This does not work, Run-Time error 13
 '
 '   .Parameters.Append .CreateParameter("?firstname", firstname)
'Result: Run-Time error 13: Type Mismatch.
' code stops her
 '   .Parameters.Append .CreateParameter("?lastnamer", lastname)
 '   .Parameters.Append .CreateParameter("?address", address)
 '   .Parameters.Append .CreateParameter("?contact", contact)
    
'======= Test 4 This does not work
'
'    .Parameters.Append .CreateParameter("?firstname", adChar, adParamInput, 30, firstname)
'    .Parameters.Append .CreateParameter("?lastnamer", adChar, adParamInput, 30, lastname)
'    .Parameters.Append .CreateParameter("?address", adChar, adParamInput, 150, address)
'    .Parameters.Append .CreateParameter("?contact", adChar, adParamInput, 20, contact)

'Debug.Print sqlQuery
'Result when debugged >  UPDATE users SET firstname = ?firstname, lastname = ?lastname, address = ?address, contact = ?contact WHERE user_id = user_id
'I do not understand, because the values should be appointed

'should it not be:
'UPDATE users SET FirstName = 'Henkie', LastName = 'Strijbos', address = 'Amsterdam', contact = '35673567' WHERE user_id= 23

'When executed >Run-time Error -2147217887 (80040e21)
' [MySQL][ODBC 8.0(w) Driver][mysqld-5.5.5-10.4.14-MariaDB] Invalid parameter Type

'=========== Test 5 This does not work
   .Parameters.Append .CreateParameter("?", adChar, adParamInput, 30, firstname)
   .Parameters.Append .CreateParameter("?", adChar, adParamInput, 30, lastname)
   .Parameters.Append .CreateParameter("?", adChar, adParamInput, 150, address)
   .Parameters.Append .CreateParameter("?", adChar, adParamInput, 20, contact)

Debug.Print sqlQuery
'Result when debugged > UPDATE users SET firstname = ?firstname, lastname = ?lastname, address = ?address, contact = ?contact WHERE user_id = user_id
'I do not understand, because the values should be appointed

'should it not be:
'UPDATE users SET FirstName = 'Henkie', LastName = 'Strijbos', address = 'Amsterdam', contact = '35673567' WHERE user_id= 23

'When executed >Run-time Error -2147217887 (80040e21)
' [MySQL][ODBC 8.0(w) Driver][mysqld-5.5.5-10.4.14-MariaDB] Invalid parameter Type
' ==
  .Execute
End With

Connect.Close
End Sub

【问题讨论】:

    标签: mysql excel vba adodb


    【解决方案1】:

    我从未设法使用命名参数,所以我只会展示如何使用未命名参数。
    a) sql 命令文本在要插入参数的地方得到一个简单的?

    sqlQuery = "UPDATE users " _
             & "   SET firstname = ?, lastname = ?, address = ?, contact = ? " _
             & " WHERE user_id = ?"
    

    b) 必须以正确的顺序附加参数。您可以设置参数名称,但它是可选的。重要的是order,您需要为查询中的每个? 创建一个参数。您可能还有一个Where-Clause 的参数(在您当前的查询中,您将更新整个表,因为 where-clause user_id = user_id 对所有记录都为真(除了那些 user_id 为空的记录)。

     .Parameters.Append .CreateParameter(, adChar, adParamInput, 30, firstname)
     .Parameters.Append .CreateParameter(, adChar, adParamInput, 30, lastname)
     .Parameters.Append .CreateParameter(, adChar, adParamInput, 150, address)
     .Parameters.Append .CreateParameter(, adChar, adParamInput, 20, contact)
     .Parameters.Append .CreateParameter(, adChar, adParamInput, 20, user_id)
    

    c) 不是 100% 确定 mySQL,但我认为您需要将参数类型设置为 adVarChar,将长度参数设置为实际字符串长度。

     .Parameters.Append .CreateParameter(, adVarChar, adParamInput, len(firstName), firstname)
     (...)
    

    d) 使用Debug.Print,您将始终看到您输入的命令文本。该命令与参数一起发送到数据库引擎,引擎会解决这个问题。 ADODB 不关心在数据库端使用的语法。这可以让您和 ADODB 从为 Date 参数添加所有正确引号或正确语法或使用哪个字符作为小数分隔符的噩梦中解脱出来。

    【讨论】:

    • 感谢您的回复。我根据您的建议更改了我的 vba 宏。它现在工作正常。您的评论:“参数必须以正确的顺序附加”是至关重要的。我必须使用所有参数(我没有使用最后一个参数> user_id)。我对 VBA 宏进行了一些调整:我将 .Parameters.Append .CreateParameter(, adChar,...) 更改为 adVarChar。对于 user_id,我使用了 > .Parameters.Append .CreateParameter(, adInteger,...)。你知道如何以及在哪里放置完整的 VBA 宏吗?以便对其他用户有用?
    猜你喜欢
    • 1970-01-01
    • 2011-10-19
    • 2010-12-23
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    相关资源
    最近更新 更多