首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不规则System.Data.OleDb.OleDbException (0x80004005):无效参数问题

不规则System.Data.OleDb.OleDbException (0x80004005):无效参数问题
EN

Stack Overflow用户
提问于 2017-11-23 12:07:34
回答 1查看 938关注 0票数 1

在生产系统中,我们有时是,有时在将excel读入数据表时得到错误消息(相同的代码,相同的文件今天不能工作,但在另一天会起作用)。

System.Data.OleDb.OleDbException (0x80004005):无效参数。( System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams,Object& executeResult( at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior,Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior,String method) at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior) ( System.Data.OleDb.OleDbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior行为)在System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset,DataTable[]数据集,Int32 startRecord,Int32 maxRecords,String srcTable,IDbCommand命令,CommandBehavior行为)在System.Data.Common.DbDataAdapter.Fill(DataTable[] datatables,Int32 startRecord,Int32 maxRecords,IDbCommand命令,System.Data.Common.DbDataAdapter.Fill(DataTable行为(System.Data.Common.DbDataAdapter.Fill(DataTable)

但问题是,在生产服务器上,它今天工作得很好,但是明天或后天,它将不能正常工作,然后它就会开始工作得很好。

下面是密码。

代码语言:javascript
复制
     string ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + readFilePath + ";Extended Properties=\"Excel 12.0;\""; 
     ExcelConnection = new OleDbConnection(ConnectionString); 
     string ExcelQuery = "Select FORMAT(SAMPDATE,'dd/MM/yyyy') as SAMPDATE,FORMAT(LANDED_ON,'dd/MM/yyyy') as LANDED_ON,FORMAT(RECDATE,'dd/MM/yyyy') as RECDATE,* from [Sheet1$]";

     ExcelCommand = new OleDbCommand(ExcelQuery, ExcelConnection); 

     ExcelConnection.Open(); 

     ExcelAdapter = new OleDbDataAdapter(ExcelCommand); 

     ExcelAdapter.Fill(dtbExcelData); 

     ExcelConnection.Close();

我还检查了变量readFilePath的值它是正确的,示例值是D:\Cop\Web\ABC\PAL\FIleUploaded\ER01.xls。

我不知道为什么完全相同的代码不允许上传相同的excel文档,但第二天相同的代码相同的文件工作没有任何问题。有人能帮我吗?

EN

回答 1

Stack Overflow用户

发布于 2017-11-26 02:26:13

几点建议。

  1. 我怀疑问题在于,Excel/Access有一些流氓实例(这里不确定哪个实例被利用了),它们阻碍了进程按预期工作。我每天(或晚上)运行一个进程,只需进入并终止任何挥之不去的客户端。我们有每天运行的Excel作业,总是有剩余的实例在运行,导致问题,除非您转到"Processes“选项卡上的任务管理器,否则您甚至无法看到它们在运行。

如果运行像这样简单的东西,它将清除任何打开的实例,甚至那些您看不到的实例:

代码语言:javascript
复制
foreach (var process in Process.GetProcessesByName("Excel"))
{
    process.Kill();
}
  1. @Crow编码器给出了使用ClosedXml的极好建议。这一点,或者很多其他第三方阅读器可以不使用OLE来读取Excel文件,而且除了.NET框架本身之外没有任何依赖关系。

这将意味着您需要完成更多的工作来读取内容并将其转换为datatable,但它也为跳过datatable提供了一个机会,这可能是有意义的,这取决于您要做的是什么。

  1. 你的评论表明,问题不在电子表格内容本身,但我不得不有点怀疑.毕竟,这是一个电子表格。电子表格上没有强数据类型这样的东西。OLE可能会评估一列是一种特定的数据类型,结果发现几乎所有日期在一个单元格中都有单词“无”的单元格。

这里要尝试的两件事首先是,使用datareader而不是datatable。这允许你不去假设任何事情。

在本例中,我认为列A是一个日期,但不是假设任何事情,而是将其呈现为字符串,并使用DateTime.TryParse来测试它。

代码语言:javascript
复制
ExcelCommand = new OleDbCommand(ExcelQuery, ExcelConnection);
OleDbDataReader reader = ExcelCommand.ExecuteReader();

DateTime orderDate;

while (reader.Read())
{
    string colA = reader.GetValue(0).ToString();
    if (DateTime.TryParse(colA, out orderDate))
    {
        // do something with orderDate here
    }
}

reader.Close();

老实说,我不确定这是否有效,但如果你不确定这不是一个内容问题的话,也许值得一试。

显然,这不仅仅是将内容猛击到datatable中所做的工作,但老实说,我从来都不是数据存储的粉丝。

  1. 我的最后一个建议--也许使用Interop将文件导出为CSV并以这种方式加载它。这并不是一个很好的建议,因为您正在创建一个Excel依赖项,这可能是问题的一部分。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47455238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档