惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
Google DeepMind News
Google DeepMind News
V
V2EX
B
Blog RSS Feed
有赞技术团队
有赞技术团队
博客园 - Franky
美团技术团队
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
腾讯CDC
云风的 BLOG
云风的 BLOG
L
LangChain Blog
GbyAI
GbyAI
The Cloudflare Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
C
Check Point Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Stack Overflow Blog
Stack Overflow Blog
博客园 - 【当耐特】
The Register - Security
The Register - Security
大猫的无限游戏
大猫的无限游戏
D
Docker
Vercel News
Vercel News
Blog — PlanetScale
Blog — PlanetScale
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
雷峰网
雷峰网
阮一峰的网络日志
阮一峰的网络日志
P
Proofpoint News Feed
N
Netflix TechBlog - Medium
博客园_首页
A
About on SuperTechFans
J
Java Code Geeks
量子位
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MongoDB | Blog
MongoDB | Blog
Recent Announcements
Recent Announcements
G
Google Developers Blog
小众软件
小众软件
博客园 - 叶小钗
WordPress大学
WordPress大学
博客园 - 聂微东
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Martin Fowler
Martin Fowler
S
SegmentFault 最新的问题
F
Full Disclosure
Jina AI
Jina AI
H
Help Net Security

博客园 - whale

Ajax提交失败,因为输入框带尖括号< listview添加列 - whale - 博客园 局域网中访问xp机器用户名为灰色,不能修改 SQL2005服务启动不了是因为VIA协议启动了 负载测试错误表包含:“未能找到应用阈值规则所需的从属计数器” CString, BSTR, LPCTSTR之间得关系和区别 移动流媒体技术及其应用发展方向(转载) - whale - 博客园 vs2005使用analysis service 项目出现错误尝试读取或写入受保护内存... - whale Excel连接Analysis service2005初始化数据源失败 利用SQL中的递归返回多行数据的连接 SQL Server不能调试存储过程解决方法 文本框放到下拉框上面。 - whale - 博客园 最好的.net学习资源 今天开始开发Mobile5.0项目 组件 访问被拒绝 配置错误 不同层的session在timeout后不能跨层访问的原因。 VB运行调试时提示不能修改 .net调试时,计算机调试管理服务被禁用的解决 局部变量的生命周期和委托的关系
ADO 读取Excel文件数据, 丢失数据或数据错误问题。
whale · 2006-04-26 · via 博客园 - whale

在用ADO读取Excel文件数据,常容易发生丢失数据的现象。

例如,用ADO打开一个Excel文件的代码如下:
 Dim objConn As ADODB.Connection
    Dim objRS As ADODB.Recordset
    Dim objRSTable As ADODB.Recordset
   
    Set objConn = New ADODB.Connection
    Set objRS = New ADODB.Recordset
    objRS.CursorLocation = adUseClient
   
    With objConn
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Data Source=" & Me.ExcelPath & ";Extended Properties=""Excel 8.0;HDR=NO;"""
        .CursorLocation = adUseClient
        .Open
    End With
   
    ' Check whether there is a sheet named "master" in the excel file
    Set objRSTable = objConn.OpenSchema(adSchemaTables)
blnMasterSheet = False
    For i = 1 To objRSTable.RecordCount
        If UCase(CStr(objRSTable.Fields("TABLE_NAME").Value)) = "MASTER$" Then
            blnMasterSheet = True
            Exit For
        End If
        objRSTable.MoveNext
    Next i
       
    Set objRSTable = Nothing
    If Not blnMasterSheet Then
        MsgBox ("Master Worksheet Is Not Found")
        Set objConn = Nothing
        Set objRS = Nothing
        GetExcelData = False
        Exit Function
    End If
   
    strExcuteScript = "select * from [Master$A1:F]"
    objRS.Open strExcuteScript, objConn, adOpenStatic, adLockOptimistic
运行后发现第一列的某些行数据丢失了。这发生在第一行是数字,第二行是文字的情况。
因为在读取excel的时候,ODBC会根据第一行的文字来设定返回的recordset的字段类型,当第一行是数字时,就会认为整列都是数字的。结果后面的字符无法读出。

这时,需要把连接字符串改为.ConnectionString = "Data Source=" & Me.ExcelPath & ";Extended Properties=""Excel 8.0;HDR=NO;IMEX=1;"""

其中,IMEX=1;这个属性的意思是,以文本方式读取excel表。 那么就算第一行是数字,后面的字符串也可以正常读出了。

问题好像是解决了。但过一段时间后,又出现了问题,读取某个列的某个行时,会出现错误。错误现象为

我们读取Excel表格后,会把数据传到另一个recordset (假定为R2)再进行处理的。在给另一个recordset付值时出错。根据错误信息,得知如果把一个超长的或者错误的数据付给一个字段时会出现这样的错误。但在R2中,我们设定了对于的字段的长度是1000的,而要付值的数据长度是628,为什么还会出错呢。这个R1的字段出来的值后面也带有很多的乱码。就是说,本来从Excel中读出来的数据已经是乱码了。

      我们把怀疑产生乱码的所有空格去掉,结果错误到了下一行。再把正常的数据复制变成很长,结果也会产生错误。再尝试把前面的正常行去掉,居然错误就不见了。
        把断点设在错误的那行,查数据的长度,是628, 再看rs.fileds(11).defineSize, 发现只有255. 那就说明,它实际字段是认为长255的,但把数据都读出来了,结果是乱码,再把这些乱码付值给另一个recordset时才报错。
        把产生错误的数据放在第一行时,是不会有这个错误的,查看它的defineSize, 发现不再是255了,而是很大的数字。
        再尝试把错误的数据放在1-8行,都不会产生问题,在9行以上就会产生。

        原来,ODBC在读取Excel时,会有个值设置TypeGuessRows=8, 意思是ODBC会先在前8行的数据中去比较,如果所有的数据都在255或以下,那这个字段长度就是varchar(255),否则,这个字段将是text类型。

      于是,我们加上TypeGuessRow=100,再试,结果错误依然存在。

      原来,虽然可以设置这个属性,但ODBC是不会去用它的,要使这个属性有效,必须修改注册表。对于注册表键是

Excel 97

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\3.5\Engines\Excel

Excel 2000 and later versions

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel

修改了里面的TypeGuessRow后,这个问题暂时解决了。

但是,如果大的数据在表的后面位置的话,这个问题还是有可能发生的。所以要彻底的解决的话,在打开一个recordset前,就要先定义好它的字段长度了。