【问题标题】:Run SQL Query From VBA从 VBA 运行 SQL 查询
【发布时间】:2016-11-30 00:25:54
【问题描述】:

我正在使用此语法从 Excel 2013 运行 SQL Server 2008 存储过程。一切都在一台 PC 上按应有的方式执行,但如果我尝试在第二台 PC 上运行它,则会出错并显示

OLEDB 连接错误

既然我对服务器名、用户名和密码进行了硬编码,那么语法是否应该在任何 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

【问题讨论】:

  • 这真的执行了吗?我看不到您将连接分配给命令的位置。此外,用Integrated Security=SSPI 提供用户名和密码是矛盾的。当然,这不是整个错误消息。
  • @PaulAbbott - 抱歉,复制/粘贴错误。我添加了 cmd.ActiveConnection = con ...。我只希望能够让任何打开工作簿的用户能够执行与 SQL Server 的连接。无论在哪台计算机上打开它。
  • 那么您是尝试使用 SQL 用户名和密码还是当前的 Windows 登录名进行身份验证?
  • 我想使用 SQL 用户名和密码进行身份验证。
  • 然后把Integrated Security=SSPI拿出来。

标签: sql-server vba excel excel-2013


【解决方案1】:

通过 VBA 连接 SQL Server 有两种方式
1) 集成安全=SSPI;
2) 通过 VBA 提供有效的用户名和密码

当您使用 SSPI 时,将使用登录用户(即 Excel 工作簿)的 Windows 登录凭据。

现在对您而言,由于您不想使用 Windows 凭据,因此您需要使用您指定的用户 ID 和密码提供 SQL 服务器登录,并且还必须与数据库中具有您指定权限的帐户相关联需要。

【讨论】:

    【解决方案2】:

    这两个示例对我来说非常适合。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-25
      • 2015-02-07
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      • 2018-06-14
      相关资源
      最近更新 更多