问题描述
我的最终目标是对sql-server运行SQL查询,并在电子表格中捕获返回的数据。以下代码大致反映了我当前的设置,并且可以正常工作。该设计使我可以从文本文件中读取sql代码,并将其提交给sql服务器。 “ Sub ExecuteCRUD”提交第一个sql脚本以准备数据并将结果转储到临时表中。 “ Function loadRecordset”提交一个相对简单的选择查询,并在记录集中捕获返回的数据,然后使用该记录集填充电子表格。
我的设置中有几个“变量”可能与讨论有关。
-
ConnectionString(我的vba代码的一部分)
-
其余的vba代码
a。 Dbo.ConnectionString =“ Provider = MSDAsql; DRIVER = sql Server; SERVER = myserver ; UID = id ; PWD = 密码; DATABASE = 数据库;“
b。 Dbo.ConnectionString =“ Provider = sqlOLEDB;数据 Source = myserver ;初始目录= 数据库;用户 ID = id ;密码= 密码;“
最初,我更改的只是连接字符串。即时结果是连接字符串版本a完美运行。使用b版本,我的设置将失败,并且不会出现来自sql-server的任何错误。
使用连接字符串版本b,“ Sub ExecuteCRUD”(数据准备步骤)仍然可以正常工作。我可以验证由于第一个sql脚本在tempdb中创建了临时表。
“ Function loadRecordset”将逐行运行,直到“ rs.open”并包括“ rs.open”都没有任何错误。 (我检查了错误,ado连接中没有任何错误。)
只有随后的代码在使用记录集复制数据时会出现错误:“关闭对象时不允许操作。”
我必须在这里重申。当使用ODBC提供程序时,我最初的sql代码集可以正常工作。使用OLEDB提供程序只能使事情发生横向变化。
使用OLEDB提供程序,“有问题”的sql代码是使用 databaseABC 。此外,使用ado,我的设置将4套sql代码提交到sql服务器。第一组sql代码准备数据(创建表,插入数据,创建索引,使用while循环填充数据,使用递归cte等)。在第一组sql代码中,还包括使用 databaseABC ,它将成功执行。提交的其他3组sql代码仅是旨在获取数据的选择查询。当使用的 databaseABC 的被列入选择查询的sql代码,操作没有任何错误而导致失败。在我取出 Use databaseABC 之后,一切将在OLEDB提供者世界中正确运行。
使用 databaseABC 不是选择查询的必要部分。使用它可以省去在连接子句中始终指定数据库名称的麻烦。
此时,我的好奇心是双重的
- 为什么使用 databaseABC 会导致失败,特别是仅在使用OLEDB提供程序时,而在运行选择查询时尤其如此。
- 发生故障时,sql-server或驱动程序是否应生成任何错误?检查和验证的正确方法是什么?
Private Dbo As New ADODB.Connection
Private rs As ADODB.Recordset
Public Sub ConnectServer()
If Dbo.State = adStateClosed Then
Dbo.ConnectionString = "Provider=sqlOLEDB;Data Source=*server*;" _
& "Initial Catalog=*database*;User ID=*id*;Password=*pwd*;"
Dbo.Open
End If
End Sub
Public Sub ExecuteCRUD(ByVal sql As String)
On Error GoTo PANIC
Dbo.Execute sql
Exit Sub
PANIC:
Debug.Print Err.Descript
Stop
End Sub
Public Function loadRecordset(ByVal sql As String) As Long
On Error GoTo PANIC
Set rs = New ADODB.Recordset
With rs
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockReadOnly
.source = sql
Set .ActiveConnection = Dbo
End With
rs.Open
loadRecordset = rs.RecordCount
Exit Function
PANIC:
Debug.Print Err.Description
loadRecordset = 0
Stop
End Function
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)