ADO中怎么利用GetCollect()函数获取EXCEL表格中完整数字
本篇文章为大家展示了ADO中怎么利用GetCollect()函数获取EXCEL表格中完整数字,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
ADO是一组由微软提供的COM组件,基于面向对象思想的编程接口。它建立在COM体系结构之上,它的所有接口都是自动化接口,因此在C++、VisualBasic、Delphi等支持COM的开发语言中通过接口都可以访问到ADO。ADO对象模型非常精炼,由三个主要对象Connection、Command、Recordset和几个辅助对象组成。
我们利用ADO技术的GetCollect()函数读取excel表中的字符串中会发现如果数字行数过长(一般>255行)会出现读取的数据不完整这种情况。这是笔者在一年前写一个读取excel表格数据中出现的情况。针对这个问题,笔者上网查询了一些材料,找到了一个很好的解决方法,并且很好的解决了这个问题。
问题的原因是这样的,因为在使用ADO.NET读取Excel表格时,OLEDB(Excel 2000-2003一般是是Jet 4.0,Excel 2007是ACE 12.0,即Access Connectivity Engine,ACE也可以用来访问Excel 2000-2003)会默认扫面Sheet中的前几行来决定数据类型,Excel并不像Access一样,一列中的单元格的数据类型可能不一样,用ADO.NET读取Excel时,ole db(JET) 会扫描sheet中前几行,默认是8行(这个值可在注册表中TypeGuessRows设定)来决定当前列的数据类型。这样,就给我们提供了一个解决这个问题的方法,需要通过修改注册表中的TypeGuessRows的值来来解决这个问题。考虑一列数据,如果前8行都是数字,那么JET扫描没有问题。如果8行内的数据类型不一样,JET会采用一个都适合的数据类型来匹配,通常为varchar或unicode varchar。现在的问题是,前8行的数据如果短小,JET匹配了varchar,只有255字符。而实际可能是其它更大的数据。
如果设置前面的TypeGuessRows=0,这样会查询16384行,查询完后匹配一个最合适的数据类型,不过这个长度对于我来说已经绰绰有余,所以有一个很好的解决方法就是将TypeGuessRows的值设为0;
TypeGuessRows在注册表中的路径如下所示:
Excel 2000-2003 :HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel\
Excel 2007 :HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel
(其取值范围为十进制闭区间0-16)
所以我们就可以写一个很简单的程序来解决该问题,代码很简单,如下所示
void SetTypeGuessRowsValue(){ HKEY hKEY; LPCTSTR dataSet="SOFTWARE\\Microsoft\\Jet\\4.0\\Engines\\Excel\\"; //打开与路径 dataSet 相关的hKEY,KEY_WRITE表示以写的方式打开 long retn = ( ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,dataSet, 0, KEY_WRITE, &hKEY) ); if( retn != ERROR_SUCCESS ) { MessageBox("错误: 无法打开有关的hKEY!"); return; }
//修改TypeGuessRows值 DWORD type = REG_DWORD; DWORD cbData = 2; BYTE VAL = 0;
retn =::RegSetValueEx(hKEY, "TypeGuessRows", NULL, type, &VAL, cbData); if( retn != ERROR_SUCCESS ) { MessageBox("错误: 无法修改有关注册表信息!"); return; }}
上述内容就是ADO中怎么利用GetCollect()函数获取EXCEL表格中完整数字,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注恰卡编程网行业资讯频道。
推荐阅读
-
4个理由告诉你Java为何排行第一
本文由码农网 –单劼原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划!Java已经有20年的历史了,甚...
-
写给精明Java开发者的测试技巧
我们都会为我们的代码编写测试,不是吗?毫无疑问,我知道这个问题的答案可能会从“当然,但你知道怎样才能避免写测试吗?”到“必须...
-
Java 微服务框架 Redkale 入门介绍
Redkale功能Redkale虽然只有1.xM大小,但是麻雀虽小五脏俱全。既可作为服务器使用,也可当工具包使用。作为独立的工...
-
Java内存管理原理及内存区域详解
一、概述Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干不同的数据区域,这些区域都有各自的用途以及创建和销毁...
-
2015年Java开发岗位面试题归类
下面是我自己收集整理的Java岗位今天面经遇到的面试题,可以用它来好好准备面试。一、Java基础1.String...
-
Java 虚拟机类加载机制和字节码执行引擎
引言我们知道java代码编译后生成的是字节码,那虚拟机是如何加载这些class字节码文件的呢?加载之后又是如何进行方法调用的呢?...
-
Java常量池理解与总结
一.相关概念什么是常量用final修饰的成员变量表示常量,值一旦给定就无法改变!final修饰的变量有三种:静态...
-
Java 实现线程死锁
概述春节的时候去面试了一家公司,笔试题里面有一道是使用简单的代码实现线程的‘死锁’,当时没有想到这道题考的是Sync...
-
Java:过去、未来的互联网编程之王
Java对你而言是什么?一门你大学里学过的语言?一个IT行业的通用语言?你相信Java已经为下一次互联网爆炸做好了准备么?Java...
-
20个高级Java面试题汇总
本文由码农网 –小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划!这是一个高级Java面试系列题中...
