【问题标题】:Insert Into from VBA - Access从 VBA 插入 - 访问
【发布时间】:2020-10-16 13:13:09
【问题描述】:

我正在尝试将一个 Insert into 语句从我的 Access DB 推送到 sql 服务器。这一直有效,但我需要更改我编写列“j”的方式,因为我现在需要区分 true 和 NULL。我不断收到错误“无效使用 null”。我应该如何投射 J 列的部分以避免此错误?

                              If trow = 0 Then
                               Sql = "INSERT ALL "
                               Sql = Sql + Chr(10) + "INTO " + username + "." + dbtable + " VALUES (" + _
                                    "q'[" + Format(rstIn("a"), "dd-mmm-yy") + "]'," + _
                                    "q'[" + Nz(rstIn("b"), "UNKNOWN") + "]'," + _
                                       "" + CStr(Nz(rstIn("c"), "0")) + "," + _
                                    "q'[" + CStr(Nz(rstIn("d"), "UNKNOWN")) + "]'," + _
                                    "" + CStr(Nz(rstIn("f"), "0")) + "," + _
                                    "" + CStr(Nz(rstIn("e"), "0")) + "," + _
                                    "" + CStr(Nz(rstIn("g"), "0")) + "," + _
                                    "" + CStr(Nz(rstIn("h"), "0")) + "," + _
                                    "q'[" + Nz(rstIn("i"), "UNKNOWN") + "]'," + _
                                    "q'[" + Format(rstIn("z"), "dd-mmm-yy") + "]'," + _
                                    "" + (rstIn("j").Value) + "," + _
                                    "" + CStr(Nz(rstIn("k"), "0")) + "," + _
                                    "" + CStr(Nz(rstIn("l"), "0")) + "," + _
                                    "" + CStr(Nz(rstIn("m"), "0")) + _
                                    ")"
                                

【问题讨论】:

  • 试试Nz(rstIn("j").Value, vbNullString)
  • 这可能是朝着正确方向迈出的一步。错误从无效 null 移动到类型不匹配。此列是数字,但它确实允许空值
  • 对于具有空值的记录,请尝试打印 SQL,以便我们查看生成的确切内容。
  • 为什么要在代码中使用混乱的连接和标点符号构建 SQL 查询? SQL Server表是Access数据库中的链接表吗? q' 前缀是什么?

标签: sql vba ms-access


【解决方案1】:

如果j 是数字字段,则不能将字符串传递给它。所以,如果 Null 不被接受,尝试一个真正的零:

"" + Nz(rstIn("j").Value, 0) + "," + _

【讨论】:

    【解决方案2】:

    假设您在 MS Access VBA 中使用 ADO 连接到 SQL Server,请考虑使用参数化解决方案来避免混乱的数据连接和引用标点符号。你甚至可以用adVarCharadDateadInteger等来定义data types的参数。

    下面显示了一个循环版本,它遍历 Access 记录集以在 SQL Server 连接中执行插入值查询。为前 5 个定义参数,以便对所有 14 个进行扩展。调整列名和任何缩写为 ... 的位置。

    Dim sql As String
    Dim connection As ADODB.Connection, cmd As ADODB.Command
    Dim rstIn As DAO.Recordset
    
    ' OPEN ACCESS LOCAL RECORDSET
    Set rstIn = CurrentDb.OpenRecordset("SELECT a, b, c, d, e, ... FROM myAccessTable")
    
    ' PREPARED STATEMENT (NO DATA) WITH ? PLACEHOLDERS
    sql = "INSERT INTO [" & username & "].[" & dbtable &] "(COL1, COL2, COL3, COL4, COL5, " _ 
           & "                                              COl6, COl7, COL8, COL9, COL10, " _
           & "                                              COL11, COL12, COl13, COl14)" _
           & " VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
    
    ' OPEN EXTERNAL SQL SERVER CONNECTION
    Set connection = New ADODB.Connection
    connection.Open "..."
    
    Do While Not rstIn.EOF
        Set cmd = New ADODB.Command       ' INITIALIZE COMMAND
    
        With cmd
            .ActiveConnection = connection
            .CommandType = adCmdText
            .CommandText = query
    
            ' BIND PARAMETERS
            .Parameters.Append .CreateParameter(, adDate, adParamInput, , rstIn("a"))
            .Parameters.Append .CreateParameter(, adVarChar, adParamInput, 255, Nz(rstIn("b"), "UNKNOWN"))
            .Parameters.Append .CreateParameter(, adDouble, adParamInput, , Nz(rstIn("c"), "0"))
            .Parameters.Append .CreateParameter(, adVarChar, adParamInput, 255, Nz(rstIn("d"), "UNKNOWN"))
            .Parameters.Append .CreateParameter(, adDouble, adParamInput, , Nz(rstIn("f"), "0"))
            ...
    
            ' RUN QUERY
            .Execute
        End With
    
        Set cmd = Nothing                 ' RELEASE COMMAND
        rstIn.MoveNext
    Loop
    
    rstIn.Close: connection.Close
    Set rstIn = Nothing: Set connection = Nothing
    

    或者,如果您可以link SQL Server table in MS Access,则可以使用更简单的插入选择查询,避免循环和一行 VBA。

    SQL (另存为存储查询)

    INSERT INTO mySQLServerLinkedTable (COL1, COL2, COL3, COL4, COL5, 
                                        COl6, COl7, COL8, COL9, COL10,                                              
                                        COL11, COL12, COl13, COl14)
    SELECT Format(a, "dd-mmm-yy"), Nz(b, "UNKNOWN"), CStr(Nz(c, "0")), 
           CStr(Nz(d, "UNKNOWN")), CStr(Nz(f, "0")), CStr(Nz(e, "0")), 
           CStr(Nz(g, "0")), CStr(Nz(h, "0")), Nz(i, "UNKNOWN"),
           Format(z, "dd-mmm-yy"), j, CStr(Nz(k, "0")), 
           CStr(Nz(l, "0")), CStr(Nz(m, "0")))
    FROM myAccessLocalTable
    

    VBA

    DoCmd.OpenQuery "mySavedInsertQuery"
    

    【讨论】:

      猜你喜欢
      • 2018-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多