社区首页 >问答首页 >VBA大SQL-查询-方法'CopyFromRecordset‘的对象’范围‘失败

VBA大SQL-查询-方法'CopyFromRecordset‘的对象’范围‘失败
EN

Stack Overflow用户
提问于 2016-01-07 01:07:00
回答 2查看 5.4K关注 0票数 0

下面发布的代码连接到oracle数据库,处理SQL查询并将结果表保存在新的工作簿中。它的工作效率高达200.000行左右。但是,对于较大的数据集,当我试图将数据从记录集对象复制到工作簿时,会出现错误方法'CopyFromRecordset‘of object 'Range’失败的

代码语言:javascript
代码运行次数:0
复制
dataWs.Range("A2").CopyFromRecordset dataset 

有什么解决办法吗?我试着遍历数据集的所有元素并将它们复制到工作表中,但是对于大型数据集来说,这需要非常长的时间。你有什么想法吗?我很感激你的帮助!下面是代码:

代码语言:javascript
代码运行次数:0
复制
Sub QueryExecute(sqlString, userPW, userID, serverName)
'Connect to database <serverName> using user name <userID> and 
'password <userPW> to process SQL query <sqlString> and save the
'query result in a new workbook

   Dim ConnStr As String
   Dim Cn As ADODB.Connection
   Dim dataset As ADODB.Recordset
   Dim dataWs As Worksheet
   Dim dataWb As Workbook
   Dim icols As Integer

   'Create new workbook that will hold the query result/table:
   Set dataWb = Excel.Application.Workbooks.Add
   Set dataWs = dataWb.Sheets(1)

   Application.Calculation = xlManual

   'Trim trailing/leading blanks from sqlString:
   sqlString = Trim(sqlString)

   'Create string for database connection:
   ConnStr = "UID=" & userID & ";PWD=" & userPW & ";DRIVER={Microsoft ODBC for Oracle};" _
                    & "SERVER=" & serverName & ";"

   'Connect to database:
   Set Cn = New ADODB.Connection

   On Error Resume Next 'Error handling in case connection does not work

   With Cn
     .ConnectionString = ConnStr
     .CursorLocation = adUseClient
     .Open
   End With

   'Error handling for failed connection:
   If Err.Number <> 0 Then

     dataWb.Close
     MsgBox "Connection to database failed. Check username and password."
     Exit Sub

   End If

   'Send SQL query to database:
   Set dataset = Cn.Execute(sqlString)

   'Error handling for failed query:
   If Err.Number <> 0 Then

     dataWb.Close
     MsgBox "SQL-query could not be processed."
     Exit Sub

   End If

   On Error GoTo 0

   'Copy column names in first row of table worksheet:
   For icols = 0 To dataset.Fields.count - 1
     dataWs.Cells(1, icols + 1).Value = dataset.Fields(icols).Name
   Next

   dataWs.Range(dataWs.Cells(1, 1), _
   dataWs.Cells(1, dataset.Fields.count)).Font.Bold = True 'Format column names

   'Copy data to workbook:
   '***THIS WILL FAIL FOR LARGE DATASETS***
   dataWs.Range("A2").CopyFromRecordset dataset 


   dataset.Close
   Cn.Close

   MsgBox "Query successful."

   Application.Calculation = xlCalculationAutomatic

End Sub
EN

回答 2

Stack Overflow用户

发布于 2016-01-07 01:27:23

根据微软文章 -最大行为1,048,576行和16,384列。假设,操作或仔细检查一百万行是不现实的--我们可以假设电子表格是在总结行吗?如果是这样的话--您应该始终将记录集返回到Excel的大小最小化。要做到这一点,您需要将数据的处理/汇总卸载到数据库中。

这可以在SQL查询或返回SYS_REFCURSOR的数据库过程中完成。这本质上是指向结果集的指针。

票数 1
EN

Stack Overflow用户

发布于 2016-01-07 03:17:38

就像@OraNob说的那样,通过过滤、聚合和排序,在数据库端将返回的数据量降到最低。如果必须检索大型数据集(以减少多次调用),则可以考虑保持记录集处于打开状态,只需将数据子集所需的数据填充到工作表中即可。如果记录集的行数超过百万行,则可以将结果写入多个工作表。

我还建议使用GetRows函数,您将需要转换它,因为GetRows数组将被标注为列然后行,并且GetRows最适合行然后列。

而且,考虑到数据集的大小,假设使用32位Office,您将无法依赖Application.Worksheet.Transpose来执行转置,因为您可能会耗尽内存,而且如果自己执行转置操作,您可能需要小心内存。考虑将转座子和插入物分成几个批次。

最后,请记住将插入作为范围执行到工作表中,因为它将比逐单元的快得多。例:

代码语言:javascript
代码运行次数:0
复制
Dim aData(1 to 10000, 1 to 16)
aRecordset = rst.GetRows(10000)
'Transpose the aRecordset into aData
'...
Sheet1.Range(Sheet1.cells(1,1),Sheet1.Cells(10000,16) = aData
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34651080

复制
相关文章
使用jQuery的animate方法制作滑动菜单
周末看Ziv小威的博客《制作滑动条菜单,如何延时处理滑动效果,避免动画卡顿》,参见地址:http://www.cnblogs.com/zivxiaowei/p/3462964.html。是通过jQury的animate方法来写的一个交互效果,当然他 觉得动画有一些卡,所以他用延时处理的方法,避免动画卡,方法可以值得借鉴。我自己用hover方法,然后动画时间设置的更短,为100毫秒,动画运行起来,速度还行。 正好自己最近需要完成一个系统的导航条的滑动效果,具体是说,hover上导航条的一个选项,此时有一个背景
八哥
2018/01/18
1.9K0
使用jQuery的animate方法制作滑动菜单
为 ASP.NET Core 程序制作 URL 的 301/302 跳转
发布于 2020-01-11 17:33 更新于 2020-01-12 14:08
walterlv
2020/02/12
3.9K0
导航菜单优化制作
摘要总结:本文主要介绍了如何利用JavaScript语言实现一个具有轮播效果和鼠标悬浮弹出菜单的导航菜单。首先介绍了JavaScript语言的基础知识,然后详细讲解了如何利用JavaScript语言实现轮播效果和鼠标悬浮弹出菜单。最后介绍了如何使用JavaScript语言实现导航菜单的交互功能。
IMWeb前端团队
2017/12/29
3.6K0
导航菜单优化制作
导航菜单优化制作
以前制作导航菜单,总要加许多id在HTML中,js代码也要将id挨个加上去,今日终于习得破解之法,不在用以前那种笨拙的方法了。
IMWeb前端团队
2019/12/03
2.7K0
asp.net中的联动菜单
目标达到的效果:两个下拉框,第二个跟随第一个变化而变化,使用客户端脚本JavaScript在ASP.NET环境下实现。
Java架构师必看
2021/03/22
1.3K0
5种设置ASP.NET Core应用程序URL的方法
•http://localhost:5000•https://localhost:5001
全球技术精选
2021/03/03
1.8K0
5种设置ASP.NET Core应用程序URL的方法
使用 Python 开发桌面应用程序的最佳方法是什么?
Python 是一种通用编程语言,可用于各种任务,包括 Web 开发、数据分析和机器学习。它的最大优点之一是它还可用于创建桌面应用程序。在本文中,我们将深入探讨使用 Python 开发桌面应用程序的最佳实践。
很酷的站长
2023/02/18
7.1K0
使用 Python 开发桌面应用程序的最佳方法是什么?
python 制作菜单栏的详细教程
matinal
2023/10/13
2780
读论文的正确姿势是什么?
但是有没有发现当你费劲巴拉的读到最后,发现所读的论文并不是你想要的。显然,这种不错过每一张表格,不错过每一个数字和每一个公式的“害怕错过”式阅读法并不是最有效的,而且这种阅读方法容易在论文的细节中迷失方向。
AI科技评论
2020/06/03
1.4K0
【javaScript案例】之二级菜单的制作
这次实现的效果图如下: 二级菜单.gif 这个二级菜单实现的效果是: 当点击某一个框时,会将已经打开的框的内容收回,再展开现在点击的框的内容。 要如何实现这个效果呢? 我们可以step by step 首先我们要将整个框架显示出来,即所有框展开的样子,因为其显示/不显示是拿overflow:hidden做的。 但是要注意不要所有的框都拿一种类型的盒子做,因为那样不方便写js代码,毕竟我们之后的操作是点击绿色的框=>使得收起或展开白色的框,所以我们需要为每一个天数+对应课程的框放在一个div父盒子下。然后为其
xinxin-l
2022/03/29
6310
【javaScript案例】之二级菜单的制作
Excel中如何制作下拉菜单
文字教程 准备好需要生成的清单 选择你想制作下拉菜单的单元格 依次点击数据→数据验证 在弹出的数据验证菜单中选择第一个设置页(默认也是这个) 在允许下面选择序列(会跳出一个来源) 点击选择按钮,选择序号1准备的清单 也可以手动输入清单,逗号得保证是英文逗号.例如输入 土建,渗漏,门窗 确定,完成 --- 图文教程 准备好需要生成的清单 [清单] 选择你想制作下拉菜单的单元格,然后依次点击数据→数据验证 [数据→数据验证] 在弹出的数据验证菜单中选择第一个设置页(默认也是这个) [设置页]
但老师
2020/02/27
1.6K0
Excel中如何制作下拉菜单
为自己的板卡制作Pynq
Xilinx Pynq 框架允许我们将 Python 和可编程逻辑结合起来。让我们看看如何为自己的ZYNQ板卡创建 Pynq 镜像。
碎碎思
2023/08/30
4890
为自己的板卡制作Pynq
大规模SQL分析:为正确的工作选择正确的SQL引擎
我们都渴望获得数据。不仅是更多的数据……还有新的数据类型,以便我们能够最好地了解我们的产品、客户和市场。我们正在寻找有关各种形状和大小(结构化和非结构化)的最新可用数据的实时洞察力。我们希望拥抱新一代的业务和技术专业人员,这些人员是对数据和能够改变数据与我们生活息息相关的新一代技术有真正热情。
大数据杂货铺
2020/02/11
1.1K0
大规模SQL分析:为正确的工作选择正确的SQL引擎
velocyto的正确安装方法
如果你已经尝试了100种错误方法,恭喜你,找到家了。这个是99.9%能保证成功的安装方式。如果你第一篇就看到这个,更加恭喜你,你少走了一万里弯路!
生信技能树jimmy
2022/01/10
4.6K0
【React】620- 为React应用制作动画的5种方法
ReactJS应用程序中的动画是一个流行的话题,有很多方法可以创建不同类型的动画。许多开发人员只使用CSS和向HTML标记添加类来创建动画。这是一个好方法,您应该使用它,如果要创建复杂的动画,可以关注GreenSock,GreenSock是最强大的动画平台。还有很多库用于在React中创建动画的组件。
pingan8787
2020/06/11
4.1K0
【React】620- 为React应用制作动画的5种方法
技巧|Python 制作动态图表的正确方式
关于动态图表,相信大家都或多或少的接触过一些,如果是代码水平比较不错的,可以选择 Matplotlib,当然也可以使用 pyecharts 的相关功能,不过这些工具都专注于图表的制作,也就是对于图表的数据,你是需要自行转换的。而今天介绍的这个可视化图库,完美的结合了 Pandas 数据格式,又辅以 Matplotlib 的强大功能,使得我们制作动图变得容易的多了。
码农向前冲
2021/12/22
1.5K2
技巧|Python 制作动态图表的正确方式
JS-制作可伸缩的水平菜单栏
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta name="author" content="郭菊锋,702004176@qq.com" /> <meta http-equiv="Content
xing.org1^
2018/05/17
4.5K0
为世界构建应用程序
在155个国家和40多种语言中增长您的业务, 并帮助世界各地的用户轻松地发现和下载您的应用程序。
iOSDevLog
2018/07/25
9300
HTML+CSS 简单的顶部导航栏菜单制作
img标签,导入图片,a标签超链接 ,img导入图片,防止图片失真width和height设置一个就可以了
全栈程序员站长
2022/09/02
3.8K0
点击加载更多

相似问题

HTML/CSS:制作粘性菜单的正确方法是什么?

14

制作控制台菜单的“正确”方法是什么?

30

WPF:制作标准菜单的正确方法

10

制作GUI的正确方法是什么

33

制作Android电视菜单的最佳方法是什么?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文