在excelvba中访问SQL数据库

在excelvba中访问SQL数据库,sql,vba,excel,adodb,Sql,Vba,Excel,Adodb,我正在从MSDN复制一个VBA代码段,该代码段向我展示了如何将SQL查询的结果抓取到excel工作表(excel 2007)中: 我已经在下面添加了Microsoft ActiveX Data Objects 2.1库作为参考。这个数据库是可以访问的 现在,当我运行这个子程序时,它有一个错误: 运行时错误3704:对象关闭时不允许操作 关于声明: ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset) 知道为什么吗 谢谢。这是正确的

我正在从MSDN复制一个VBA代码段,该代码段向我展示了如何将SQL查询的结果抓取到excel工作表(excel 2007)中:

我已经在下面添加了Microsoft ActiveX Data Objects 2.1库作为参考。这个数据库是可以访问的

现在,当我运行这个子程序时,它有一个错误:

运行时错误3704:对象关闭时不允许操作

关于声明:

ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset)
知道为什么吗


谢谢。

这是正确的连接字符串吗?
SQL Server实例位于何处

您需要验证是否能够使用上面指定的连接字符串连接到SQL Server

编辑:查看记录集的状态属性以查看它是否打开?

另外,在打开记录集之前,请将CursorLocation属性更改为adUseClient。

我坐在一台没有任何相关软件的计算机旁,但从内存来看,代码似乎是错误的。您正在执行命令,但放弃了
objMyCommand.Execute
返回的
记录集

我会:

Set objMyRecordset = objMyCommand.Execute

…然后丢失“打开记录集”部分。

我已将初始目录添加到您的连接字符串中。我还放弃了ADODB.Command语法,只创建自己的SQL语句并打开该变量的记录集

希望这有帮助

Sub GetDataFromADO()
    'Declare variables'
        Set objMyConn = New ADODB.Connection
        Set objMyRecordset = New ADODB.Recordset
        Dim strSQL As String

    'Open Connection'
        objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=MyDatabase;User ID=abc;Password=abc;"
        objMyConn.Open

    'Set and Excecute SQL Command'
        strSQL = "select * from myTable"

    'Open Recordset'
        Set objMyRecordset.ActiveConnection = objMyConn
        objMyRecordset.Open strSQL            

    'Copy Data to Excel'
        ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset)

End Sub
建议的修改:

  • 不要调用命令对象的Execute方法
  • 将记录集对象的源属性设置为命令对象
  • 调用记录集对象的Open方法,不带参数
  • 在调用
    CopyFromRecordset
    时,删除Recordset对象周围的括号
  • 实际声明变量:)
修订守则:

Sub GetDataFromADO()

    'Declare variables'
        Dim objMyConn As ADODB.Connection
        Dim objMyCmd As ADODB.Command
        Dim objMyRecordset As ADODB.Recordset

        Set objMyConn = New ADODB.Connection
        Set objMyCmd = New ADODB.Command
        Set objMyRecordset = New ADODB.Recordset

    'Open Connection'
        objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;User ID=abc;Password=abc;"    
        objMyConn.Open

    'Set and Excecute SQL Command'
        Set objMyCmd.ActiveConnection = objMyConn
        objMyCmd.CommandText = "select * from mytable"
        objMyCmd.CommandType = adCmdText

    'Open Recordset'
        Set objMyRecordset.Source = objMyCmd
        objMyRecordset.Open

    'Copy Data to Excel'
        ActiveSheet.Range("A1").CopyFromRecordset objMyRecordset

End Sub

set nocount on
添加到存储过程的开头(如果您在SQL Server上)。我在自己的工作中刚刚解决了这个问题,它是由中间结果引起的,例如
“1203行受影响”
,加载到我试图使用的
记录集中。

@firedrawndagger:列出字段名/列标题迭代记录集字段集合并插入名称:

Dim myRS as ADODB.Recordset
Dim fld as Field
Dim strFieldName as String 

For Each fld in myRS.Fields
    Activesheet.Selection = fld.Name
    [Some code that moves to next column]
Next

+1用于删除括号。不必要的括号加上对象引用似乎会导致奇怪的VBA错误。我意识到这是一个旧线程,但我想知道是否有办法修改上述代码以检索表头?帮助!我也有同样的错误,但下面的解决方案没有帮助:它对我有效,谢谢,记得添加对Microsoft ActiveX Data Objects 2.1的引用,但我添加了2.6版本。最后你不需要关闭连接吗?像objMyRecordset。关闭?
Dim myRS as ADODB.Recordset
Dim fld as Field
Dim strFieldName as String 

For Each fld in myRS.Fields
    Activesheet.Selection = fld.Name
    [Some code that moves to next column]
Next