mysql - 运行时错误 3001 '参数类型错误或超出可接受范围...' INSERT INTO MySQL 数据库
问题描述
我知道有很多相同类型的问题,但没有人帮助我,我真的被困住了。所以我正在尝试使用 VBA 从 Excel 表中发送数据,但我总是收到相同的错误:'运行时错误 3001'参数类型错误或超出可接受范围'问题是我不明白我的错误在哪里来自?是来自我的 SQL 查询还是来自 Visual Basic 代码?我的代码在 3 sub
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
现在您有一个函数,它要么连接并返回 live ADODB.Connection
,要么不连接并返回Nothing
- 并且所有涉及的值的范围都没有超出它们需要的范围。
所以InsertData
现在可以使用了。现在,我们根本不需要 a Recordset
- 我们不关心任何记录,我们只想运行INSERT
查询;这可能会针对连接本身运行 - 请注意,数量VALUES
必须与子句中指定的列数相匹配INSERT INTO
......并且由于一组硬编码的值不是很有用,您需要正确参数化这些值(不要将工作表单元格值连接到您的 SQL 语句中 -见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
推荐阅读
- python - 试图用随机数据填充表但收到空集
- javascript - React JS - 无法在尚未安装的组件上调用 setState
- java - 在 EDT 上调用 Container#validate 是强制性的吗?
- java - 如何防止 UI 元素调整大小?
- php - 使用 PHP 更改 div 内容
- linux - 在后台使用 Celery 运行 Flask 服务器
- r - geom_col 以最低的数字作为最高的条显示排名
- google-cloud-vision - 未找到匹配的产品。请验证 ProductSet 是否存在、有图像并且已被索引。谷歌云愿景
- python - Python 监视 QNAP FTP 目录的变化并发送 UDP 消息
- java - How to retrieve values in database and show in jsp select tag when another select tag is selected?