mysql - 运行时错误 3001 'Arguments are of the wrong type or out of acceptable range…' 插入 MySQL 数据库

标签 mysql sql excel vba sql-insert

我知道有很多相同类型的问题,但没有人帮助我,我真的陷入困境。 因此,我尝试使用 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/

相关文章:

PHP MYSQL 防止同时从不同用户插入时获取重复的唯一 ID

sql - 在 PostgreSQL 中将重叠的间隔分割成较小的、接触的间隔

excel - 将许多表转换为 Excel 列

mysql - 数据库中的三列条件

mysql - MySQL 中的方括号 LIKE

php - 一次显示主记录和所有图像 php mysql

mysql - "InvalidOperationException : Connection must be valid and open"在 MySqlConnection 上

mysql - 检索表中出现次数最多的值

javascript - 在 Excel VBA 中解析 JSON 对象数组

json - VBA解析json并循环不同的对象