我知道有很多相同类型的问题,但没有人帮助我,我真的陷入困境。 因此,我尝试使用 VBA 从 Excel 表发送数据,但总是收到相同的错误:“运行时错误 3001 '参数类型错误或超出可接受的范围” 问题是我不明白我的错误从何而来?是来 self 的 SQL 查询还是来自 Visual Basic 代码? 我的代码在 3 个子中
Dim oConn As ADODB.Connection
第二个
Private Sub ConnectDB()
Set oConn = New ADODB.Connection
Dim str As String
str = "DRIVER={MySQL ODBC 5.1 Driver};" & _
"SERVER=XXX.XXX.XXX.XXX" & ";" & _
"PORT=3306" & ";" & _
"DATABASE=myDB" & ";" & _
"USER=User" & ";" & _
"PASSWORD=pwd" & ";" & _
"Option=3"
''' error '''
oConn.Open str
End Sub
最后一个
Sub InsertData()
Dim Rs As ADODB.Recordset
Dim Requete As String
Set Rs = New ADODB.Recordset
Call ConnectDB
With Sheets("Feuil5")
Requete = "INSERT INTO Position (Emplacement,Etage,Colonne,Taille) VALUES ('1','1','1','1');"
Rs.Open Requete, oConnect, adOpenDynamic, adLockOptimistic
End With
Debug.Print Requete
oConnect.Close
Set Rs = Nothing
End Sub
有人可以发现我的错误并帮助在 vba 中实现简单的 sql 查询吗?
最佳答案
ConnectDB
的工作是创建数据库连接。不要分配给在另一个作用域中声明的某个 oConn
对象(可能已经连接并打开),而是将其设为 Function
。
Private Function ConnectDB() As ADODB.Connection
Dim conn As ADODB.Connection
Set conn = New ADODB.Connection
Const connString As String = _
"DRIVER={MySQL ODBC 5.1 Driver};" & _
"SERVER=XXX.XXX.XXX.XXX;" & _
"PORT=3306l" & _
"DATABASE=myDB;" & _
"USER=User;" & _
"PASSWORD=pwd;" & _
"Option=3"
On Error GoTo CleanFail
conn.Open connString
Set ConnectDB = conn
Exit Function
CleanFail:
Debug.Print "Error opening database connection:"
Debug.Print Err.Number, Err.Description
Debug.Print "ConnectDB is returning Nothing."
Set ConnectDB = Nothing
End Function
现在您有了一个函数,它要么连接并返回实时 ADODB.Connection
,要么不连接并返回 Nothing
- 并且所有涉及的值都不受范围限制比它们需要的更宽。
所以InsertData
现在可以使用它。现在,我们根本不需要 Recordset
- 我们不关心任何记录,我们只想运行 INSERT
查询;这可以针对连接本身运行 - 请注意,VALUES
的数量必须与 INSERT INTO
子句中指定的列数相匹配...并且由于硬编码集值不是很有用,您需要正确参数化这些值(不要将工作表单元格值连接到 SQL 语句中 - meet Little Bobby Tables ):
Public Sub InsertData(ByVal emplacement As String, ByVal etage As String, ByVal colonne As String, ByVal taille As String)
Dim conn As ADODB.Connection
Set conn = ConnectDB
If conn Is Nothing Then
' couldn't connect to database; review Debug output, fix connection string.
MsgBox "Could not connect to database.", vbExclamation
Exit Sub
End If
Const sql As String = _
"INSERT INTO Position (Emplacement, Etage, Colonne, Taille) " &
"VALUES(?, ?, ?, ?) "
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = conn
cmd.CommandType = adCmdText
cmd.CommandText = sql
'TODO: verify parameter types & sizes.
'NOTE: parameters must be added in the order they are specified in the SQL.
cmd.Parameters.Append cmd.CreateParameter(Type:=adVarWChar, Size:=200, Value:=emplacement)
cmd.Parameters.Append cmd.CreateParameter(Type:=adVarWChar, Size:=200, Value:=etage)
cmd.Parameters.Append cmd.CreateParameter(Type:=adVarWChar, Size:=200, Value:=colonne)
cmd.Parameters.Append cmd.CreateParameter(Type:=adVarWChar, Size:=200, Value:=taille)
On Error GoTo CleanFail
cmd.Execute '<~ when you DO need a recordset, this gets you your recordset.
CleanExit:
conn.Close
Exit Sub
CleanFail:
Debug.Print "Error executing command: " & sql
Debug.Print Err.Number, Err.Description
Resume CleanExit
End Sub
关于mysql - 运行时错误 3001 'Arguments are of the wrong type or out of acceptable range…' 插入 MySQL 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57958999/