【发布时间】:2014-05-25 23:49:52
【问题描述】:
我终于有了我需要的代码,在我的机器上按预期执行,并从多个 SQL 服务器返回我期望的结果。问题是部分代码仅适用于我的机器。我们正在使用特定凭据运行 Excel 电子表格(使用以不同用户身份运行),但是下面的代码只能在我的机器(用于开发代码的机器)上正确执行。
在四个不同的 SQL 服务器上命中了四个 SQL DB。当其他人运行此脚本时,前三个功能在其他人的机器上正常运行。第四个 SQL 调用在 while not EOF 行上进入无限循环。 SQL 查询返回一个无限的空值记录集,无论该查询是否正常返回任何数据。这不会发生在我的机器上,但会发生在我们测试过的其他机器上。此调用与其他调用之间的一个区别是连接字符串。其他服务器使用以下连接字符串语法连接:
Provider=SQLOLEDB.1;Integrated Security=SSPI;Initial Catalog=XXXX;Data Source=XXXX;
有问题的 SQL 查询(如下所示)使用以下语法:
Driver={SQL Server Native Client 11.0};Server=XXXX;Database=XXXX;Trusted_Connection=yes;
此连接字符串是唯一适用于此版本 SQL Server 的连接字符串。
你认为什么会导致这个查询每次在其他人的机器上调用时返回一个无限的空记录集,而不是在我的机器上?
我们检查了 Excel 的版本、操作系统、硬件架构、补丁、对 SQL 服务器的访问、通过 SSMS 运行 SQL 查询、安装了 SQL 相关组件——甚至让其他人登录我的机器并使用必要的电子表格运行电子表格证书。仅适用于我的机器。
'Variables
Set objMyConn = New ADODB.Connection
Set objMyCmd = New ADODB.Command
Set objMyRecordset = New ADODB.Recordset
'Open connection
objMyConn.ConnectionString = "Driver={SQL Server Native Client 11.0};Server=XXXX;Database=XXXX;Trusted_Connection=yes;"
objMyConn.Open
'Set and execute SQL command
Set objMyCmd.ActiveConnection = objMyConn
objMyCmd.CommandText = "<Valid SQL Statement>"
objMyCmd.CommandType = adCmdText
'Open recordset
Set objMyRecordset.Source = objMyCmd
objMyRecordset.Open objMyCmd
sbuildStr = ""
While Not objMyRecordset.EOF ' HERE IS WHERE THE PROBLEM LIES ON THE MACHINES OF OTHERS
strPSTPath = CStr(objMyRecordset("foox"))
strPSTSize = CStr(objMyRecordset("PSTSize"))
sbuildStr = sbuildStr & strPSTPath & " - " & strPSTSize & Chr(10) & Chr(13)
objMyRecordset.MoveNext
Wend
ThisWorkbook.Sheets("WORKBOOK").Cells(i, 11).Value = sbuildStr
【问题讨论】:
-
如果我更改连接字符串并删除“Trusted_Connection=yes;”部分,我收到与其他机器上相同的错误。有趣的。现在正在调查。
-
其他人是否可以使用windows身份验证访问sql server?
-
您使用什么错误处理?您在此代码上方是否有“On Error Resume Next”?您是否有可能遇到某种错误,然后导致您陷入无限循环
标签: sql sql-server excel vba