简体   繁体   English

mySQL、Excel、VBA和ADODB(命令)参数故障

[英]mySQL, Excel, VBA and ADODB (command) trouble with parameters

I have a database (localhost) with user data.我有一个包含用户数据的数据库(本地主机)。 I use mySQL.我使用 mySQL。 I want to update these data by using an Excelsheet.我想使用 Excelsheet 更新这些数据。 I have written some VBA code.我写了一些 VBA 代码。 I have looked into this solution: adodb trouble with parameters and vba but that does not work for me.我已经研究过这个解决方案:adodb Trouble with parameters and vba但这对我不起作用。

I made a VBA macro and did some tests.我做了一个 VBA 宏并做了一些测试。 The macro only works with the 'normal' SQL-string.该宏仅适用于“普通”SQL 字符串。 I have put the different tests and errors in the code.我在代码中加入了不同的测试和错误。 I can't figure out what i am doing wrong.我无法弄清楚我做错了什么。 I already searched with Google for the different Errors, but i can''t find sufficient information about我已经用谷歌搜索了不同的错误,但我找不到足够的信息

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

I checked the database and the value type settings for the columns (varChar), so that seems (?)ok.我检查了数据库和列(varChar)的值类型设置,所以看起来(?)没问题。 Can some one help me out?有人可以帮我吗? Best Regards M.最好的问候 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

I never managed to work with named parameters, so I will only show how to work with unnamed.我从来没有设法使用命名参数,所以我只会展示如何使用未命名参数。
a) The sql command text get a simple ? a) sql 命令文本得到一个简单的? at the place where you want to insert a parameter.在要插入参数的地方。

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

b) Parameter must be appended in the correct order. b) 参数必须以正确的顺序附加。 You can set a parameter name, but it's optional.您可以设置参数名称,但它是可选的。 The important thing is the order , and you need to create exactly one parameter for every ?重要的是顺序,您需要为每个? in your query.在您的查询中。 You probably have also a parameter for the Where -Clause (in your current query, you would update the whole table as the where-clause user_id = user_id is true for all records (except for those where the user_id is null).您可能还有一个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) Not 100% sure about mySQL, but I think you need to set the parameter type to adVarChar and the length parameter to the actual string length. c) 不是 100% 确定 mySQL,但我认为您需要将参数类型设置为 adVarChar 并将长度参数设置为实际字符串长度。

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

d) With Debug.Print , you will always see the command text that you have entered. d) 使用Debug.Print ,您将始终看到您输入的命令文本。 The command is send together with the parameters to the database engine, and the engine resolves this.该命令与参数一起发送到数据库引擎,引擎会解决这个问题。 ADODB does not care about the syntax that is used on the database side. ADODB 不关心在数据库端使用的语法。 This saves you and ADODB from the nightmare of putting all the correct quotes or the correct syntax for a Date parameter, or which character is used as decimal separator.这可以让您和 ADODB 从为 Date 参数添加所有正确引号或正确语法或使用哪个字符作为小数分隔符的噩梦中解脱出来。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM