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

时间:2017-11-23 12:07:34

标签: c# asp.net excel datatable oledbdataadapter

在生产系统上,我们 SOMETIMES 在读取excel到datatable时得到以下错误消息(相同的代码同一个文件今天不起作用,但将在其他日期)。

  

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(对象&安培;   executeResult)at   System.Data.OleDb.OleDbCommand.ExecuteCommand(的CommandBehavior   行为,对象& executeResult)at   System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(的CommandBehavior   行为,String方法)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 [] datatables,Int32 startRecord,Int32 maxRecords,   字符串srcTable,IDbCommand命令,CommandBehavior行为)at   System.Data.Common.DbDataAdapter.Fill(DataTable [] dataTables,Int32   startRecord,Int32 maxRecords,IDbCommand命令,CommandBehavior   在System.Data.Common.DbDataAdapter.Fill(DataTable   的dataTable)

但问题是,在生产服务器上它今天运行良好,但明天或后天它将无法正常工作,然后它将再次开始运作良好。

以下是代码。

     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文档但是第二天相同的代码相同的文件没有任何问题。 有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:1)

一些建议。

  1. 怀疑问题是,有一些恶意的Excel / Access实例(不确定这里有哪一个被利用)阻止了进程按预期工作。我会每天(或晚上)进行一次流程,直接进入并终止任何挥之不去的客户。我们有每天运行的Excel作业,并且总是有剩余的实例在运行,导致出现问题,除非你去任务管理器进行过程,否则你甚至无法看到它们正在运行。标签。
  2. 如果您运行的内容非常简单,它将清除所有打开的实例,即使是那些您无法看到的实例:

    foreach (var process in Process.GetProcessesByName("Excel"))
    {
        process.Kill();
    }
    
    1. @Crowcoder给出了使用ClosedXml的绝佳建议。这或其他第三方读者可以在不使用OLE的情况下读取Excel文件,并且不依赖于.NET框架本身。
    2. 这将意味着您需要更多的工作来阅读内容并将其转换为数据表,但它也创造了一个机会,可以将数据表全部跳过,这可能是有意义的,具体取决于您要执行的操作。< / p>

      1. 您的评论表明问题不在于电子表格内容本身,但我无能为力,但有点怀疑......毕竟,它是一个电子表格。电子表格上没有强大的数据类型。 OLE可以评估列是某种数据类型,只是为了找到几乎所有日期都包含单词&#34; NONE&#34;在一个牢房里。
      2. 首先要尝试的两件事是,首先使用datareader而不是数据表。这使你不能假设任何事情。

        在此示例中,我认为列A是一个日期,而不是假设我将其呈现为字符串并使用DateTime.TryParse进行测试。

        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();
        

        老实说,我不确定这是否有效,但如果你不是1000%确定它不是内容问题,那么它可能值得一试。

        显然,这不仅仅是将内容砸到数据表中,而且说实话,我从来都不是数据表的粉丝。

        1. 我的最终建议 - 也许使用Interop将文件导出为CSV并以这种方式加载。这不是一个很好的建议,因为您正在创建Excel依赖项,这可能是问题的一部分。