2

我需要将数据从 excel 上传到数据库中,但我需要先检查每次上传的表中是否有数据,以便更新或插入数据。

为了区分更新或插入,我使用了一个 SQL IF EXIST 命令,该命令在 SQL 中可以正常工作。当我在 Excel VBA 中尝试此操作时,我收到一条错误消息:“未为命令对象设置命令文本。”

请参阅下面的代码

Dim strSQL As String
Dim Value As String
Dim Reference As String 

    Set RCconn = New ADODB.Connection
    Set TuneCMD = New ADODB.Command
    ' Establish Recordset
    Set Results = New ADODB.Recordset
    'Establish a Connection
    With RCconn
       .Provider = "SQLOLEDB"
       .ConnectionString = ConStr
    End With
    'Open the connection
    RCconn.Open

'i Columns
For i = 5 To 10 '16
'j rows
For j = 6 To 60 '145

Value= Sheets("Value").Cells(j, i)
Reference= "W_F/P_" & Sheets("Reference").Cells(j, i)

stringTest = "IF EXISTS (SELECT * FROM UploadTable WHERE Ref = '" & Reference &  "') "
stringTest = stringTest & "UPDATE Val "
stringTest = stringTest & "SET Val = '" & Value & "' "
stringTest = stringTest & "where Ref = '" & Reference & "' "
stringTest = stringTest & "Else "
stringTest = stringTest & "INSERT INTO UploadTable (Val , Ref ) "
stringTest = stringTest & "values ('" & Value & "', '" & Reference & "')"

RCconn.Execute strSQL

Next
Next

Set Results = Nothing
RCconn.Close
Set RCconn = Nothing

是不是不能在VBA中使用'IF EXIST'?有解决办法吗?

谢谢

4

1 回答 1

3

ADODB.Connection.Execute向您的数据库发送传递查询。该字符串中的 SQL 语句无关紧要;如果您的数据库可以理解它,它将被执行。因此,再次检查您的 SQL 查询。

试试这个:

在行上放一个断点RCconn.Execute strSQL。当调试器在那里中断时,检查strSQL. 复制它并直接在 SQL Server Management Studio 中执行。如果这不起作用,请更正构建该字符串的代码。如果它有效,那么您的 ConnectionString 存在一些问题。在这种情况下,请检查您在 ConnectionString 中用于连接的用户 ID 和密码是否具有足够的权限。

于 2013-11-14T11:10:59.490 回答