小编Sim*_*neF的帖子

Excel文件中的古怪SELECT通过OleDbDataAdapter方法(C#)

我有一个这种形式的Excel文件:

Column 1    Column 2    Column 3  
 data1        data2    
 data1        data2  
 data1        data2  
 data1        data2  
 data1        data2       data3  
Run Code Online (Sandbox Code Playgroud)

也就是说,除了最后一行之外,整个第3列都是空的.我通过OleDbDataAdapter访问Excel文件,返回一个DataTable:这是代码.

query = "SELECT * FROM [" + query + "]";
objDT = new DataTable();
objCmdSQL = this.GetCommand();
objCmdSQL.CommandText = query;
objSQLDad = new OleDbDataAdapter(objCmdSQL);
objSQLDad.Fill(objDT);
return objDT;
Run Code Online (Sandbox Code Playgroud)

关键是,在这种情况下,我的代码返回一个只有第1列和第2列的DataTable.
我的猜测是JET引擎试图通过每列中第一个单元格的类型来推断列类型; 作为第一个值null,整个列被忽略.
我试图填写零,这段代码实际上是返回所有三列; 这显然是最不可取的解决方案,因为我必须处理大量的小文件.
反转选择范围(从"A1:C5"到"C5:A1")也不起作用.我正在寻找更优雅的东西.
我已经发现了一些讨论类型不匹配的帖子(int列中的varchar单元格,反之亦然),但实际上还没有发现与此相关的任何内容.
谢谢阅读!

编辑

奇怪的行为再次.我必须处理大多数Excel 2003 .xls文件,但由于这个问题已得到解答,我认为我可以针对Excel 2007 .xslx文件测试我的代码.连接字符串如下:

string strConn = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + _fileName.Trim() + @";Extended Properties=""Excel 12.0;HDR=No;IMEX=1;""";
Run Code Online (Sandbox Code Playgroud)

我得到"外部表不是预期的格式"异常,当ACE/JET和正在打开的文件之间存在版本不匹配时,我认为这是标准异常.

字符串

Provider=Microsoft.ACE.OLEDB.12.0 
Run Code Online (Sandbox Code Playgroud)

意味着我正在使用最新版本的OLEDB,我快速浏览了一下,这个版本用于需要连接到.xlsx文件的任何地方.
我尝试过只有一个香草提供商(只有Excel 12.0,没有IMEX和HDR),但我得到了同样的例外.
我在.NET 2.0.50727 …

c# excel null oledbcommand oledbdataadapter

2
推荐指数
1
解决办法
1万
查看次数

标签 统计

c# ×1

excel ×1

null ×1

oledbcommand ×1

oledbdataadapter ×1