2016-11-30 155 views
0

我正在使用此语法从Excel 2013运行SQL Server 2008存储过程。所有事情都像在一台PC上一样执行,但如果我尝试在第二台PC上运行它,则会出错从VBA运行SQL查询

OLEDB连接错误

不应该因为我硬编码服务器名称,用户名和密码的语法运行瓦特/ OA栓在任何PC上?

Function RunSQLServerProc() 
Dim con As ADODB.Connection 
Dim cmd As ADODB.Command 
Dim rs As ADODB.Recordset 
Set con = New ADODB.Connection 
Set cmd = New ADODB.Command 
Set rs = New ADODB.Recordset 
con.Open "Provider=SQLOLEDB;Data Source=Server;Initial Catalog=Database;User Id=userid;Password=password;Integrated Security=SSPI;Trusted_Connection=Yes;" 
cmd.ActiveConnection = con 
cmd.CommandText = "TestProc" 
Set rs = cmd.Execute(, , adCmdStoredProc) 
End Function 
+1

这实际上执行?我没有看到您将连接分配给命令的位置。另外,用“Integrated Security = SSPI”提供用户ID和密码是矛盾的。当然,这不是完整的错误信息。 –

+0

@PaulAbbott - 对不起,复制/粘贴错误。我在cmd.ActiveConnection = con中添加了....我只希望能够让打开工作簿的任何用户能够执行到SQL Server的连接。无论打开的计算机如何。 –

+0

那么你想用SQL用户名和密码或当前的Windows登录进行身份验证? –

回答

0

有两种方法,通过VBA
1)集成安全性= SSPI连接到SQL Server;
2)通过所述VBA

提供一个有效的用户名密码&当使用SSPI,Windows登录的登录的用户(即,在Excel工作簿的)将用于凭据。

现在对于您来说,由于您不想使用Windows凭据,您需要提供一个带有您指定的用户ID和密码的SQL服务器登录,并且还必须与数据库中的帐户关联,你需要。

0

这两个样品对我来说工作得很好。

Option Explicit 

Sub CallSprocOne() 

Dim con As Connection 
Dim rst As Recordset 
Dim strConn As String 

Set con = New Connection 
strConn = "Provider=SQLOLEDB;" 
strConn = strConn & "Data Source=LAPTOP\SQL_EXPRESS;" 
strConn = strConn & "Initial Catalog=Northwind;" 
strConn = strConn & "Integrated Security=SSPI;" 

con.Open strConn 

'Put a country name in Cell E1 
Set rst = con.Execute("Exec dbo.TestNewProc '" & ActiveSheet.Range("E1").Text & "'") 

'The total count of records is returned to Cell A5 
ActiveSheet.Range("A5").CopyFromRecordset rst 

rst.Close 
con.Close 

End Sub 


Sub CallSprocTwo() 

Dim con As Connection 
Dim rst As Recordset 

Set con = New Connection 
con.Open "Provider=SQLOLEDB;Data Source=LAPTOP\SQL_EXPRESS;Initial Catalog=Northwind;Integrated Security=SSPI;" 

Set rst = con.Execute("Exec dbo.[Ten Most Expensive Products]") 
'Results of SProc are returned to Cell A1 
ActiveSheet.Range("A1").CopyFromRecordset rst 

rst.Close 
con.Close 
End Sub