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