2015-06-17 43 views
2

一种新的这一点,我试图用参数化查询执行INSERT查询(Oracle数据库)在VBA擅长执行在VBA参数化的插入查询擅长

Dim cnn As ADODB.Connection 
Dim rs As ADODB.Recordset 
Dim ccmd As New ADODB.Command 

str = "Provider=MSDAORA;Data Source=db;Persist Security Info=True;Password=pword;User ID=uname" 
Set cnn = CreateObject("ADODB.Connection") 
cnn.Open str 
Set rs = CreateObject("ADODB.Recordset") 

ccmd.ActiveConnection = cnn 
ccmd.CommandText = "Insert into Table Values(@col1,@col5,@col8,@col6,@col7,@col2,@col3,@col4)" 
ccmd.CommandType = adCmdText 

ccmd.Parameters.Append ccmd.CreateParameter("@col1", adVarChar, adParamInput, 50, Cells(i, 1).Value) 
ccmd.Parameters.Append ccmd.CreateParameter("@col5", adVarChar, adParamInput, 50, Cells(i, 5).Value) 
ccmd.Parameters.Append ccmd.CreateParameter("@col8", adVarChar, adParamInput, 50, Cells(i, 8).Value) 
ccmd.Parameters.Append ccmd.CreateParameter("@col6", adVarChar, adParamInput, 50, Cells(i, 6).Value) 
ccmd.Parameters.Append ccmd.CreateParameter("@col7", adVarChar, adParamInput, 50, Cells(i, 7).Value) 
ccmd.Parameters.Append ccmd.CreateParameter("@col2", adVarChar, adParamInput, 50, Cells(i, 2).Value) 
ccmd.Parameters.Append ccmd.CreateParameter("@col3", adVarChar, adParamInput, 50, Cells(i, 3).Value) 
ccmd.Parameters.Append ccmd.CreateParameter("@col4", adVarChar, adParamInput, 50, Cells(i, 4).Value) 

'execute the command here, im having an error here. I'm not sure how to execute the command. I'm also not sure whether the error i'm getting is caused by how im executing the command or something else. 

'I've tried: 
'ccmd.Execute 
'cnn.Execute(ccmd.CommandText) 
'rs = ccmd.execute 

自动化错误

是我得到什么

编辑:

尝试改变我的查询到Insert into Table Values(?,?,?,?,?,?,?,?),我仍然得到自动化错误。还尝试删除我的参数名称中的'@'字符,并尝试使用':'或'?'。

回答

0

有一些方法可以在插入中包含范围,但是您确定自己获得了良好的连接吗?您可以使用以下代码(请参阅打开后的If)检查为自动化错误是一个相当常见的错误,可能包含几个不同的可能问题(用户没有正确的权限是常见的)。

如果这项工作有效,下一步将更新您的问题或评论与新的问题,您可以获得帮助的各种方法来添加单元格范围到Oracle。另外,MSDAORA已折旧,请参阅the accepted answer here了解更多信息。

' Works on one of my test systems 
Dim SQLString As String 
str = "Provider=MSDAORA;Data Source=db;Persist Security Info=True;Password=pword;User ID=uname" 

Set cnn = New ADODB.Connection 
cnn.ConnectionString = str 
cnn.ConnectionTimeout = 90 
' Set the connection string directly and set timeout rather than open so 
' We can check if connect worked. 

cnn.Open 
If cnn.State = adStateOpen Then 
    MsgBox "Connected" 
Else 
    MsgBox "Sorry. Connection Failed" 
    Exit Sub 
End If 

' Then I'd try a simple insert command and see if that works (to target error) 
' If this works then the error is likely how the insert is created 
SqlString = "Insert into table Values('Something Silly')" 
cnn.Execute SqlString, ,adCmdText ' As this is a direct SQL you shouldn't need adCmdText but will later 

cnn.Close 
+0

我实际上有一个更新查询,在插入之前工作得很好,所以我确定连接没问题。但我没有使用参数进行更新查询。这是一个简单的'sqlStr ='更新表设置ColumnA ='“&Cells(i,1).Value&”'“''cnn.Execute(sqlStr)' – crimson

+0

@crimson首先,* insert *与*更新*,所以我会建议测试两者。现在无法进入计算机来更新此设置,只有建议将删除'ccmd'调用,并直接调用'ccn'或使用[ccmd * with *](http://stackoverflow.com/questions/) 4806409 /创建参数化-SQL查询合的Excel-2010与 - VBA?RQ = 1) – JGreenwell