社区首页 >问答首页 >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

复制
相关文章
从文字到画作
通过文字描述一个场景或一个人,然后计算机就会按照你的描述生成画作。目前有很多开源或闭源产品,比如最近比较火的Stable Diffusion 、DALL·E,国内的Paddlepaddle都实现从文本到图像。
TalkPython
2022/11/21
3100
从文字到画作
char 、char[]、char*、 const char*、string(无效的const char *到XXXX的转化)
1、std::string 和QString在网络传输的过程中是不建议配套的,传过去,接到就成乱码了。 我因为这个愚蠢而把我们客户端人员坑惨了。
看、未来
2020/08/26
1.7K0
char 、char[]、char*、 const char*、string(无效的const char *到XXXX的转化)
为什么不推荐使用BeanUtils属性转换工具
1 背景 之前在专栏中讲过“不推荐使用属性拷贝工具”,推荐直接定义转换类和方法使用 IDEA 插件自动填充 get / set 函数。
崔笑颜
2020/07/23
1.7K0
为什么不推荐使用BeanUtils属性转换工具
从char 数据类型到smalldatetime 数据类型的转换导致smalldatetime 值越界
select * from dbo.pds_operation_log where ( plan_code=12 and create_time between ‘1900-01-01’ and ‘2098-12-31’ ) order by create_time asc
全栈程序员站长
2022/08/30
7010
为什么不推荐使用BeanUtils属性转换工具
之前在专栏中讲过“不推荐使用属性拷贝工具”,推荐直接定义转换类和方法使用 IDEA 插件自动填充 get / set 函数。
明明如月学长
2021/08/31
7920
为什么不推荐使用BeanUtils属性转换工具
java字符数组char[]和字符串String之间的转换
使用String.valueOf()将字符数组转换成字符串 void (){ char[] s={'A','G','C','T'}; String st=String.valueOf(s); System.out.println("This is : "+st); } >> This is : AGCT 使用.toCharArray()将字符串转换成字符数组 String st="AGCT"; char[] s=st.toCharArray(); for (int i=0;i<st.leng
演化计算与人工智能
2020/08/14
2.2K0
c++char和int转换_int转换为char数组
在学习c++,opencv时,想读取有规律的一些图像,图像名时有规律的数字,要用到int 转char* 类型,可以写代码,但是为了方便和整洁打算用c++自带的函数写成。 在转换时要用char []类的,因为在这里我们不能初始化char*所以要分配一块内存空间。
全栈程序员站长
2022/11/01
1.2K0
char转换为数字_char字符转int
刷题遇到一个考点是 char型数字 转 int 进行计算的问题。一看就会,一做就错,显然是在这里的认识薄弱了。将一番搜索的结果记录下来,以备再忘来打脸。
全栈程序员站长
2022/11/10
4.1K0
C++ char*,const char*,string的相互转换
转自:http://blog.163.com/reviver@126/blog/static/1620854362012118115413701/
forrestlin
2022/04/02
1.2K0
java int与char的转换
char与int的相互转化,联想ASCII码,字符‘0’对应的值为48,所以不能直接加减‘ ’
SingYi
2022/07/14
5000
char *转换为string的陷阱:char*中包含较多的'\0'
今天给团队调试一个错误,概率性的加密的数据没法做解密,现象是解密出来的结果和源数据长度不一致,很奇怪的现象,因为加密使用的数据是随机的,所以使得问题出现时表象是概率的问题;
呱牛笔记
2023/05/02
6920
char *转换为string的陷阱:char*中包含较多的'\0'
ORA-22835 缓冲区对于 CLOB 到 CHAR 转换或 BLOB 到 RAW 转换而言太小
做项目的时候遇到一个报错:ORA-22835 缓冲区对于 CLOB 到 CHAR 转换或 BLOB 到 RAW 转换而言太小。查找原因发现是某个字段在数据库中是clob类型。然后sql语句进行查询的时候,对该字段进行了to_char操作。由于varchar类型最大长度为4000,而clob中的内容长度高于4000。于是产生这样的问题。针对这个问题,结合自己的测试,想了以下三种解决方法,在此进行记录。
星哥玩云
2022/08/17
5.5K0
『C++』字符串后面空字符的问题(char*与string的转换)
此时输出结果应为mynameis,然而输出结果为mynameis口(空字符标志打不出来); 所以用字符数组给string赋值时要用assign()
风骨散人Chiam
2020/10/28
9900
QString与char *的相互转换
在进行编程时,我们经常需要用到字符串这种类型,毫无疑问,Qt 库中也对字符串类型进行了封装,QString 类提供了你能想到的所有字符串操作方法,给开发者带来了极大方便。
全栈程序员站长
2022/08/26
2.6K0
一句SQL,判断char列的值是否组成回文字符串
Table t has 2 columns: id INT; value CHAR(1); Column id starts from 0, increased by 1 each row Column value is a single character string Table t has at least 1 row String s is a palindrome when: s[i] = s[s.length - i - 1] for i = 0 … (s.length – 1) / 2 E.g.: a, aba, abba. Q: Write one SQL statement to check if the string composed of value of t ordered by id is a palindrome (case sensitive). Output “Y” or “N”.
小爷毛毛_卓寿杰
2019/02/13
8440
一句SQL,判断char列的值是否组成回文字符串
char转换成string java_int类型转换成char类型
原文地址:http://www.only-demo.com/java/20190220/277.html
全栈程序员站长
2022/11/09
8490
char类型转换成int_char 转int
程序真的是极简啊,用联合类型有时候用来转换数据类型是非常方便实用的,其中的原理就是因为联合类型共用一个内存空间咯,但是要注意它是小端模式存储的,低字节对应低地址。
全栈程序员站长
2022/09/27
3.3K0
char类型转换成int_char 转int
为什么不推荐使用PHPicker
iOS 14 中系统新增了一个图片选择器 PHPicker,官方建议使用 PHPicker 来替代原有的 API 进行图片选择,下面我们来看看 PHPicker 的优点:
ios-lan
2020/10/23
2.6K0
为什么不推荐使用PHPicker
Qt中QString 和 int char char*等相互转换
在编写Qt程序过程中经常遇到各种数据类型的转换,故此写下来方便自己和大家的查找。叮!!!
用户5908113
2019/07/30
4.2K0
点击加载更多

相似问题

不推荐使用从字符串到char*的转换

10

从字符串常量到“char*”的不推荐转换

43

从字符串常量到char *错误的不推荐转换

52

C++不推荐使用从字符串常量到'char*‘的转换

11140

C++ -从字符串常量到“char*”的不推荐转换

45
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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