使用ADO和提供程序= SQLOLEDB

问题描述

我的最终目标是对sql-server运行SQL查询,并在电子表格中捕获返回的数据。以下代码大致反映了我当前的设置,并且可以正常工作。该设计使我可以从文本文件中读取sql代码,并将其提交给sql服务器。 “ Sub ExecuteCRUD”提交第一个sql脚本以准备数据并将结果转储到临时表中。 “ Function loadRecordset”提交一个相对简单的选择查询,并在记录集中捕获返回的数据,然后使用该记录集填充电子表格。

我的设置中有几个“变量”可能与讨论有关。

  1. 我的4组sql代码

  2. ConnectionString(我的vba代码的一部分)

  3. 其余的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连接中没有任何错误。)

只有随后的代码在使用记录集复制数据时会出现错误关闭对象时不允许操作。”

通过一些测试,我将问题范围缩小到了sql代码

我必须在这里重申。当使用ODBC提供程序时,我最初的sql代码集可以正常工作。使用OLEDB提供程序只能使事情发生横向变化。

使用OLEDB提供程序,“有问题”的sql代码使用 databaseABC 。此外,使用ado,我的设置将4套sql代码提交到sql服务器。第一组sql代码准备数据(创建表,插入数据,创建索引,使用while循环填充数据,使用递归cte等)。在第一组sql代码中,还包括使用 databaseABC ,它将成功执行。提交的其他3组sql代码仅是旨在获取数据的选择查询。当使用的 databaseABC 被列入选择查询sql代码,操作没有任何错误而导致失败。在我取出 Use databaseABC 之后,一切将在OLEDB提供者世界中正确运行。

使用 databaseABC 不是选择查询的必要部分。使用它可以省去在连接子句中始终指定数据库名称的麻烦。

此时,我的好奇心是双重的

  1. 为什么使用 databaseABC 会导致失败,特别是仅在使用OLEDB提供程序时,而在运行选择查询时尤其如此。
  2. 发生故障时,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 (将#修改为@)