【发布时间】:2014-01-30 04:28:53
【问题描述】:
我正在使用以下 ADO 查询 Excel 2010 工作簿:
Function WorksheetRecordsetSQL(workbookPath As String, sheetName As String, selectSQL As String) As ADODB.Recordset
Dim objconnection As New ADODB.Connection
Dim objrecordset As New ADODB.Recordset
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H1
objconnection.CommandTimeout = 99999999
objconnection.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & workbookPath & ";" & _
"Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";"
objrecordset.Open selectSQL, _
objconnection, adOpenStatic, adLockOptimistic, adCmdText
Set WorksheetRecordsetSQL = objrecordset
End Function
当我用这个 SQL 调用它时:
Select * FROM [someWorksheet$]
函数执行成功。但如果我这样称呼它:
Select *,cdate(someField) FROM [someWorksheet$]
然后我得到这个错误:
Too many fields defined.
我发现select * 查询生成的记录集包含 255 个字段(Access 引擎在查询中可以拥有的最大值),即使工作表中只有 58 列。这样一个额外的cdate() 列就会使引擎过载并产生错误。
有没有一种方法可以防止select * 查询从 Excel 工作表中提取空白列?或者我可以设置一些允许超过 255 个字段的参数?
【问题讨论】:
-
你试过设置
HDR=False吗? -
我不明白你为什么要获取“someFields 两次?如果你只想要“someField”然后写:“Select cdate(someField) FROM [someWorksheet$]”
-
@carleson,我需要单独获取
someField,因为ADO 将其数据类型检测为文本,因此12/13/35被逐字读取为字符串而不是12/13/1935。所以我还需要选择它作为日期。