OldDbException: Too many field defined.

byustep 2009-12-22 03:14:50
我有一个excel表格,里面第一行是日期,2009全年的,所以估计有接近300列。
然后我想用OleDb来处理,基本语法如下:
private static DataSet ReadExcel(string filePath, string[] sheetNames)
{
// create connectoin.
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties=\"Excel 8.0;HDR=NO;IMEX=1\"";
OleDbConnection conn = new OleDbConnection(strConn);

DataSet ds = new DataSet();
try
{
conn.Open();
foreach (string name in sheetNames)
{
string sql = string.Format("select * from [{0}]", name);
OleDbDataAdapter myCommand = new OleDbDataAdapter(sql, strConn);
myCommand.Fill(ds, name);
}
return ds;
}
catch (Exception ex)
{
return ds;
}
finally
{
conn.Close();
conn.Dispose();
}
}

但是在myCommand.Fill(ds, name);的时候抛出Exception:Too Many Field defined.大家遇到过没?有没有好的解决方案。

我刚开始在想既然是OleDbException,那我该sql语句为select top 100 * from [{0}]试试看的,但是还是抛出该异常。。。

...全文
198 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwwwb 2009-12-23
  • 打赏
  • 举报
回复
在ACCESS中测试:
SELECT * from [excel 8.0;database=r:\temp\book1.xls].[{0}$]
可以得到结果

"select * from [{0}]"->
"select * from [{0}$]"

楼主修改一下试试
byustep 2009-12-23
  • 打赏
  • 举报
回复
没关系,不过至少读取的时候不抛出异常,能读到最后一个:)
WWWWA 2009-12-23
  • 打赏
  • 举报
回复
呵呵,确实是这样,不能用SQL方式。
byustep 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 wwwwa 的回复:]
在VFP中用OLE方式打开XLS文件,可以得到最后一个列的值
ff=_ole_excel.Sheets(1).UsedRange.Columns.Count
FOR i=1 TO ff
IF i=ff
WAIT WINDOW _ole_excel.Sheets(1).cells(2,i).value
endif
ENDFOR 

看来必须用OLE方式了
[/Quote]

好像那个ff是256唉?正好是最大值,似乎还有值没读取出来:(
WWWWA 2009-12-23
  • 打赏
  • 举报
回复
是SELECT *,看来你要用OLE方式打开XLS
byustep 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 wwwwa 的回复:]
用你的XLS文件,在ACCESS中
SELECT * from [excel 8.0;database=r:\temp\eonia_2009.xls].[eonia$]
测试,提示
定义了过多的列
[/Quote]
是啊是啊,这个不是我的Excel,我是取的internet上面的数据,我就纳闷人家这么多列怎么就能够填充进去的呢?
所谓的定义了过多的列,是指Excel定义过多的列,还是Sql语句select * 的时候返回过多的列呢?
WWWWA 2009-12-23
  • 打赏
  • 举报
回复
在VFP中用OLE方式打开XLS文件,可以得到最后一个列的值
ff=_ole_excel.Sheets(1).UsedRange.Columns.Count
FOR i=1 TO ff
IF i=ff
WAIT WINDOW _ole_excel.Sheets(1).cells(2,i).value
endif
ENDFOR

看来必须用OLE方式了
WWWWA 2009-12-23
  • 打赏
  • 举报
回复
用你的XLS文件,在ACCESS中
SELECT * from [excel 8.0;database=r:\temp\eonia_2009.xls].[eonia$]
测试,提示
定义了过多的列
byustep 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 acmain_chm 的回复:]
给一个你的SQL语句以供测试
[/Quote]
我是这样动态获取第一张sheet名字的:
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + xlsPath + ";Extended Properties=\"Excel 8.0;HDR=NO;IMEX=1\"";
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();

DataTable excelTabs = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);
string sheetName = excelTabs.Rows[0]["TABLE_NAME"].ToString();

调式看到SQL如下:select * from [Eonia$]
Excel路径如下:http://www.euribor.org/html/download/eonia/eonia_2009.xls

ACMAIN_CHM 2009-12-23
  • 打赏
  • 举报
回复
给一个你的SQL语句以供测试
byustep 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wwwwa 的回复:]
引用 6 楼 byustep 的回复:
引用 1 楼 wwwwb 的回复:
EXCEL版本是什么?2003及以下为255个字段


是的啊,我的是2003,我就不知道人家生成Excel数据的时候为什么能够超过255这个最大数字。有什么好的建议? 是Excel的问题吗?还是OleDb select 语句最多只允许select出255啊?

不会吧
EXCEL2007最大

1048576行;16384列

在2003中只有255列,超过除非用2007编辑
如果可以的话,
上传你的xls到www.access911.net/csdn
,用WINRAR压缩
[/Quote]

我已经给了excel的地址了,就搞不懂他怎么填充那些数据进去的:(
byustep 2009-12-23
  • 打赏
  • 举报
回复
谢谢大家,Excel文件的地址如下:http://www.euribor.org/html/download/eonia/eonia_2009.xls
大家可以下载下来试试看读取的时候有没有错误:)
WWWWA 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 byustep 的回复:]
引用 1 楼 wwwwb 的回复:
EXCEL版本是什么?2003及以下为255个字段


是的啊,我的是2003,我就不知道人家生成Excel数据的时候为什么能够超过255这个最大数字。有什么好的建议? 是Excel的问题吗?还是OleDb select 语句最多只允许select出255啊?
[/Quote]
不会吧
EXCEL2007最大

1048576行;16384列

在2003中只有255列,超过除非用2007编辑
如果可以的话,
上传你的xls到www.access911.net/csdn
,用WINRAR压缩
byustep 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wwwwb 的回复:]
在ACCESS中测试:
SELECT * from [excel 8.0;database=r:\temp\book1.xls].[{0}$]
可以得到结果

"select * from [{0}]"->
"select * from [{0}$]"

楼主修改一下试试
[/Quote]
我穿个的参数是带$的sheet 名字,所以不是这个地方的问题。
byustep 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 acmain_chm 的回复:]
console.writeline (sql) 看一下内容是什么,估计你的表名有问题。
[/Quote]
不是sql语句的问题,在小于255行的时候可以的。
byustep 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wwwwb 的回复:]
EXCEL版本是什么?2003及以下为255个字段
[/Quote]

是的啊,我的是2003,我就不知道人家生成Excel数据的时候为什么能够超过255这个最大数字。有什么好的建议? 是Excel的问题吗?还是OleDb select 语句最多只允许select出255啊?
ACMAIN_CHM 2009-12-22
  • 打赏
  • 举报
回复
"select * from [{0}]",

从这个语句分析,不可能是由于select * 中产生了过多的列。 应该是表名上的问题。
WWWWA 2009-12-22
  • 打赏
  • 举报
回复
Too many field defined:定义了过多的列
ACMAIN_CHM 2009-12-22
  • 打赏
  • 举报
回复
console.writeline (sql) 看一下内容是什么,估计你的表名有问题。
wwwwb 2009-12-22
  • 打赏
  • 举报
回复
EXCEL版本是什么?2003及以下为255个字段

2,209

社区成员

发帖
与我相关
我的任务
社区描述
其他数据库开发 其他数据库
社区管理员
  • 其他数据库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧