【问题标题】:SQL Management Studio 2012 with Excel vba connection string set up设置了 Excel vba 连接字符串的 SQL Management Studio 2012
【发布时间】:2016-10-05 13:39:47
【问题描述】:

我想设置一个 vba 代码来连接到 sql management studio 2012 并运行我将在 vba 代码中指定的查询。我已经阅读了关于堆栈溢出的所有类似问题,但是当我尝试复制它们时,我总是收到一个错误,通常是用户登录失败。

我认为我设置了错误的字符串连接。另外,我需要通过 Windows 身份验证进行用户身份验证。

我知道数据库名称、服务器名称和我的用户名。

这是我正在使用的代码,它给了我一个错误。

Sub ConnectionExample6()
 Dim cnn As ADODB.Connection
 Dim rs As ADODB.Recordset

 Set cnn = New ADODB.Connection

 ' Open a connection by referencing the ODBC driver.
 cnn.ConnectionString = "driver={SQL Server};" & _
  "server=SERVER NAME;uid=USER ID;pwd=MyPassword;database=DATABASE NAME"
 cnn.Open

' Create a Recordset by executing an SQL statement.
 Set rs = cnn.Execute("Select top 100 * from "TABLE NAME" aac " & _
 "where aac.EffectiveDate = '10/04/16'")

 ' Close the connection.
 rs.Close

End Sub

有人可以指导我完成连接字符串以及如何逐步设置它吗?谢谢。

【问题讨论】:

  • 错误是:运行时错误'-2147217843 (80040e4d)':[Microsoft][ODBC SQL Server Driver]用户'USER ID'登录失败
  • 如果要使用 Windows 身份验证,请不要在连接字符串中提供用户 ID/密码。
  • Mat 搞定了,只要确保所有使用此宏的用户都可以公开访问 SQL 服务器和数据库。或者,将它们添加到具有访问权限的域上的组中。
  • 太棒了!非常感谢,它有效!

标签: sql sql-server vba excel


【解决方案1】:

认证

如果您要连接到 SQL Server,您应该更喜欢 Windows 身份验证(如果可用):您在服务器级别为一组 Active Directory 用户创建一个 Login,然后创建一个 Windows-使用该登录名在您的数据库中经过身份验证的用户

这样您就可以将密码和用户名保留在硬编码字符串之外,并让网络处理身份验证。

假设您不想在网络中的数十个启用宏的工作簿副本中维护密码,您将希望使用 Windows 身份验证。

Integrated Security=SSPI; Persist Security Info=True;

服务器

连接字符串烦人的 - 似乎每个能够解析它们的不同事物都有不同的格式/措辞!

由于您使用的是 ADODB,因此您需要指定 ProviderData Source 以及可选的初始目录

Provider=SQLOLEDB.1; Data Source=SQL Server instance name; Initial Catalog=Database name;

谁?

可以在服务器上监控每个连接;在构建连接字符串时,您可以选择指定一个工作站 ID 来标识连接所针对的机器。

Workstation ID=computer name;

您可以通过获取环境变量值来获取计算机名称,使用Environ$

Private Function GetWorkstationId() As String
    GetWorkstationId = Environ$("ComputerName")
End Function

给定一个名为 SomeSqlServer 的 SQL Server 实例、一个名为 SomeDatabase 的数据库,并使用 Windows 身份验证,ADODB 连接字符串如下所示:

Dim connString As String
connString = "Provider=SQLOLEDB.1; Data Source=SomeSqlServer; Initial Catalog=SomeDatabase; Integrated Security=SSPI; Persist Security Info=True;"

SomeUserSomePassword 提供 SQL 身份验证(使用硬编码的用户名和密码):

connString = "Provider=SQLOLEDB.1; Data Source=SomeSqlServer; Initial Catalog=SomeDatabase; UID=SomeUser; PWD=SomePassword;"

命令

您不想将任意用户输入连接到 WHERE 子句中;避免直接从 ADODB.Connection 对象执行 SQL 字符串。

相反,创建一个ADODB.Command,并参数化您的查询。

Dim sql As String
sql = "SELECT Foo, Bar FROM dbo.FooBars WHERE Foo = ? AND DateInserted > ?"

这里我们有 2 个参数。

首先我们创建命令

Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
cmd.ActiveConnection = conn
cmd.CommandType = adCmdText
cmd.CommandText = sql

然后是它的参数,假设我们在param1Valueparam2Value局部变量中有各自的值:

Dim param1 As ADODB.Parameter ' a string parameter
Set param1 = New ADODB.Parameter
param1.Type = adVarWChar
param1.Direction = adParamInput
param1.Size = Len(param1Value)
param1.Value = param1Value
cmd.Parameters.Append param1

Dim param2 As ADODB.Parameter ' a date parameter
Set param2 = New ADODB.Parameter
param2.Type = adDate
param2.Direction = adParamInput
param2.Value = param2Value
cmd.Parameters.Append param2

然后我们通过执行命令检索记录集:

Dim results As ADODB.Recordset
Set results = cmd.Execute

当然这看起来很冗长,但它可以很容易地重构为专用于创建给定特定类型值的参数的函数。

因此,您避免了这种情况,因为您不再执行连接到查询中的任意用户输入:

【讨论】:

  • 很好的答案,更好的卡通片
猜你喜欢
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
相关资源
最近更新 更多