我终于有了我需要的代码,在我的机器上按预期执行,并从许多 SQL 服务器返回我期望的结果。问题是部分代码仅适用于我的机器。我们正在使用特定凭据运行 Excel 电子表格(使用以不同用户身份运行),但是下面的代码只能在我的机器(用于开发代码的机器)上正确执行。
在四个不同的 SQL 服务器上,有四个 SQL DB 被命中。当其他人运行此脚本时,前三个功能在其他人的机器上正常运行。第四个 SQL 调用在 while not EOF 行上进入无限循环。 SQL 查询返回一个无限的空值记录集,无论该查询是否正常返回任何数据。这不会发生在我的机器上,但会发生在我们测试过的其他机器上。此调用与其他调用之间的一个区别是连接字符串。使用以下连接字符串语法连接其他服务器:
Provider=SQLOLEDB.1;集成安全=SSPI;初始目录=XXXX;数据源=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
最佳答案
删除 On Error Resume Next 后,我能够收到特定的错误代码,提醒我该问题。经过一番研究,我发现代码没有在其他人的机器上执行,因为没有安装 SQL Server Native Client 11。感谢您朝正确的方向轻推,安德兰。
关于sql - VBA Excel - 通过 ADO 的 SQL 查询返回无限的空记录集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23019095/