【发布时间】: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
【问题讨论】: