通过 excel VBA 加入 SQL 表时出错

Posted

技术标签:

【中文标题】通过 excel VBA 加入 SQL 表时出错【英文标题】:Getting an error while joining the SQL tables through excel VBA 【发布时间】:2015-05-19 15:58:56 【问题描述】:

我需要一些帮助。我正在尝试通过具有联接查询的 excel 中的 SQL 提取数据,但是在运行以下代码时出现调试错误..

recset.Open strSQL, con, adOpenDynamic, adLockOptimistic

错误 - 运行时错误 -2147467259

下面是代码.....请帮助:confused:

Sub Show_data()

    Dim con As ADODB.Connection
    Dim recset As ADODB.Recordset
    Dim ConnectionString As String
    Dim strSQL As String

    Set con = New ADODB.Connection
    Set recset = New ADODB.Recordset

''Check for the connectivity or connected to the xx network
    On Error GoTo errHandler

errHandler:
    If Err.Number = -2147467259 Then
        MsgBox "Please check for the xx connectivity ", vbExclamation + vbOKOnly
        Exit Sub
    End If


    ConnectionString = "Provider=MSDASQL;User ID=myuser;password= mypass;Data Source=mys"

    con.Open ConnectionString

    'Set and Excecute SQL Command'

        strSQL = "SELECT B.USER_NAME AS CREATED_BY, A.CREATION_DATE, C.USER_NAME, A.LAST_UPDATE_DATE, A.PFIZER_ITEMCODE, A.SYSTEM_ITEMCODE AS ORACLE_ITEM_CODE," & _
        "A.ITEM_DESCRIPTION, A.BATCH_NUMBER, A.MFR_CODE, A.MFR_DESC AS MFR_DESCRIPTION, TO_CHAR(A.MFR_DATE,'DD-MON-YYYY')As MFR_DATE, TO_CHAR(A.EXPIRY_DATE,'DD-MON-YYYY')As EXPIRY_DATE," & _
        "TO_CHAR(A.EFFECTIVE_FROM,'DD-MON-YYYY') AS EFFECTIVE_FROM," & _
        "A.EFFECTIVE_TO, A.EXCISE AS EXCISE_AMOUNT, A.EXCISE_RATE, A.P2S, A.P2R, A.MRP, A.STATE_CODE, A.STATE," & _
        "(CASE SUBSTR(A.SYSTEM_ITEMCODE,6,2) WHEN ('PI') THEN 'OIP' WHEN ('PF') THEN 'OPF' ELSE 'OWL' END )AS LEGAL_ENTITY" & _
        "FROM xxdhl_pf_batch_pricing A, fnd_user B, fnd_user c" & _
        "WHERE 1=1" & _
        "AND A.CREATED_BY = B.USER_ID" & _
        "AND A.LAST_UPDATED_BY = C.USER_ID"

        If (ActiveSheet.cmbLE.Text) <> "" Then
        strSQL = strSQL & " LEGAL_ENTITY='" & ActiveSheet.cmbLE.Text & "'"
        End If

        If (ActiveSheet.cmbProduct.Text) <> "" Then
            If (ActiveSheet.cmbLE.Text) <> "" Then
                strSQL = strSQL & " AND [ORACLE_ITEM_CODE]='" & ActiveSheet.cmbProduct.Text & "'"
            Else
                strSQL = strSQL & " [ORACLE_ITEM_CODE]='" & ActiveSheet.cmbProduct.Text & "'"
            End If
        End If

        If (ActiveSheet.txtBatch.Text) <> "" Then
            If (ActiveSheet.cmbLE.Text) <> "" Or (ActiveSheet.cmbProduct.Text) <> "" Then
                strSQL = strSQL & " AND [BATCH_NUMBER]='" & ActiveSheet.txtBatch.Text & "'"
            Else
                strSQL = strSQL & " [BATCH_NUMBER]='" & ActiveSheet.txtBatch.Text & "'"
            End If
        End If



    'Open Recordset

    Set recset.ActiveConnection = con
    recset.Open strSQL, con, adOpenDynamic, adLockOptimistic

    'Copy the data
    If recset.RecordCount > 0 Then
    Sheets("Sheet2").Range("A1").CopyFromRecordset recset
'    ActiveSheet.Range("A1").CopyFromRecordset recset
    Else
    MsgBox "No Data Available", vbExclamation + vbOKOnly
    Exit Sub
    End If

recset.Close
con.Close

End Sub

根据您的所有要求,我已打印 strSQL

    SELECT B.USER_NAME AS CREATED_BY, A.CREATION_DATE, C.USER_NAME, 
    A.LAST_UPDATE_DATE, 
    A.PFIZER_ITEMCODE, A.SYSTEM_ITEMCODE AS ORACLE_ITEM_CODE, 
    A.ITEM_DESCRIPTION, A.BATCH_NUMBER, 
        A.MFR_CODE, A.MFR_DESC AS MFR_DESCRIPTION, 
        TO_CHAR(A.MFR_DATE,'DD-MON-YYYY')As MFR_DATE, 
    TO_CHAR(A.EXPIRY_DATE,'DD-MON-YYYY')As EXPIRY_DATE, 
        TO_CHAR(A.EFFECTIVE_FROM,'DD-MON-YYYY') AS EFFECTIVE_FROM, 
A.EFFECTIVE_TO, A.EXCISE AS EXCISE_AMOUNT, 
        A.EXCISE_RATE, A.P2S, 
A.P2R, A.MRP, A.STATE_CODE, A.STATE, 
        (CASE SUBSTR(A.SYSTEM_ITEMCODE,6,2) WHEN ('PI') THEN 'OIP' WHEN ('PF') THEN 'OPF' ELSE 'OWL' END )AS LEGAL_ENTITY 
            FROM xxdhl_pf_batch_pricing A, fnd_user B, fnd_user c 
WHERE 1=1 AND A.CREATED_BY = B.USER_ID AND A.LAST_UPDATED_BY = C.USER_ID  AND [A.LEGAL_ENTITY]='J0012' AND [A.SYSTEM_ITEMCODE]='1407_PI-J0012'

【问题讨论】:

你能在 strSQL 运行之前打印它并附加到问题上吗? 应该将[A.LEGAL_ENTITY] 改为A.LEGAL_ENTITY[A].[LEGAL_ENTITY] 等等。 【参考方案1】:

你有类似代码的地方

"WHERE 1=1" & _
"AND A.CREATED_BY = B.USER_ID" & _

它会被渲染

"WHERE 1=1AND A.CREATED_BY = B.USER_ID"

1=1AND 之间没有空格

尝试在每行的右引号前加一个空格:

"WHERE 1=1 " & _
"AND A.CREATED_BY = B.USER_ID " & _

【讨论】:

哪行代码产生了错误?你能打印 strSQL 变量吗?如果使用“SELECT * FROM Table”之类的内容,是否还会出现错误? 此行是否出现错误:recset.Open strSQL, con, adOpenDynamic, adLockOptimistic?要打印 strSQL 的值,请使用该行之前的行 Debug.Print strSQL,并将变量的值写入 IDE 中的即时窗口。 此 sql AND A.LAST_UPDATED_BY = C.USER_ID LEGAL_ENTITY='OIP' AND 中的“LEGAL_ENTITY”之前是否缺少“AND” 我认为您需要注释掉所有 WHERE 代码,然后逐渐取消注释位并运行代码以查找导致问题的位。看起来您在 FROM 子句中使用了两次 fnd_user 表 - 这是故意的吗? 如前所述,我认为您需要注释掉所有 WHERE 代码,运行代码,然后逐渐取消注释位并运行代码以查找导致问题的位。 【参考方案2】:

使用“& _”扩展器可以添加到字符串变量的字符数是有限制的。

Chip 对 Debug.Print 变量的建议会在您尝试执行之前告诉您此查询是否可行。

当我为查询创建 SQL 时,我使用这样的过程来避免截断:

strSQL = "SELECT "
strSQL = strSQL & "Field1, Field2, Field3 "
strSQL = strSQL & "FROM MyTable "

在每行末尾添加一个空格可确保不会发生上述 Andy 指出的问题。

【讨论】:

【参考方案3】:

类似于 Andy Joiner 的建议,您实际上在几个地方的末尾缺少一个空格。例如

"(CASE SUBSTR(A.SYSTEM_ITEMCODE,6,2) WHEN ('PI') THEN 'OIP' WHEN ('PF') THEN 'OPF' ELSE 'OWL' END )AS LEGAL_ENTITY" & _
"FROM xxdhl_pf_batch_pricing A, fnd_user B, fnd_user c" & _

看起来像:

"(CASE SUBSTR(A.SYSTEM_ITEMCODE,6,2) WHEN ('PI') THEN 'OIP' WHEN ('PF') THEN OPF' ELSE 'OWL' END )AS LEGAL_ENTITYFROM xxdhl_pf_batch_pricing A, fnd_user B, fnd_user c" & _

从而消除您的 FROM 子句。

【讨论】:

是的,我尝试了空间,但我仍然面临同样的错误 如前所述,我们需要查看完整的查询,因为它正在传递给 SQL 您好,我已经从调试 sql 的打印中输入了查询...请查看并告诉我是否有...请 LEGAL_ENTITY 是 xxdhl_pf_batch_pricing 表中的一个字段吗? 那你不能使用a.[LEGAL_ENTITY],你应该使用:(CASE SUBSTR(A.SYSTEM_ITEMCODE,6,2) WHEN ('PI') THEN 'OIP' WHEN ('PF ') THEN 'OPF' ELSE 'OWL' END ) = ''J0012' 代替。看起来它永远不会评估为真......【参考方案4】:

最后我解决了这个错误.....实际上是在一个编码中,我给出了参数,其中引号给出了问题......即

之前我使用以下代码运行查询,

strSQL & " AND [ORACLE_ITEM_CODE]='"

只是因为有报价

"["

...遇到这个错误。

但删除后它的工作正常......

感谢所有分享知识以解决错误的人...这也有助于我获得知识...

谢谢大家

【讨论】:

以上是关于通过 excel VBA 加入 SQL 表时出错的主要内容,如果未能解决你的问题,请参考以下文章

通过 Excel VBA 进行 SQL 查询的复杂 JOIN 子句中的语法错误

在 Access 中通过 VBA 传输表时出错

Excel VBA 数组下标越界出错

Excel VBA 7.1错误'430':在设置X=新工作表时。

Excel VBA通​​过单击形状更改形状的背景图像

通过vba发送邮件但没有发送功能模块