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

在生产系统上,我们是有时读取excel到数据表(在同一代码相同的文件不会今天工作,但会在其他date)获取下面的错误信息。

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在System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior行为,string方法)System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior行为)上的.OleDbCommand.ExecuteCommand(CommandBehavior行为,对象和executeResult)

System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset,DataTable [] datatables,Int32 startRecord,Int32 maxRecords,String srcTable,IDbCommand命令,System.Data.OleDb.OleDbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior行为) System.Data.Common.DbDataAdapter.Fill(DataTable [] dataTables,Int32 startRecord,Int32 maxRecords,IDbCommand command,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(); 

我也检查过variablesreadFilePath的值是否正确,示例值是D:\ Cop \ Web \ ABC \ PAL \ FIleUploaded \ ER01.xls。

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

几个build议。

  1. 怀疑问题是有stream氓Excel / Access的实例(不知道哪一个被利用在这里)阻止进程按预期工作。 我会每天(或者晚上)运行一个进程来进入并终止任何徘徊的客户端。 我们有每天运行的Excel作业,总是有剩余的实例在运行,造成问题,甚至不能看到它们运行,除非你去“进程”选项卡上的任务pipe理器。

如果你像这样简单的运行,它将清除任何打开的实例,即使是你看不到的实例:

 foreach (var process in Process.GetProcessesByName("Excel")) { process.Kill(); } 
  1. @Crowcoder给了使用ClosedXml的优秀build议。 这个或其他第三方阅读器可以读取Excel文件,而无需使用OLE,并且不需要依赖于.NET框架本身。

这将意味着更多的工作来读取内容并将其转换为数据表,但是它也创造了一个跳过数据表的机会,这可能是有意义的,具体取决于你想要做什么。

  1. 您的意见表明,问题不在于电子表格内容本身,但我不禁有些怀疑……毕竟这是一个电子表格。 在电子表格上没有强大的数据loggingfunction。 OLE可以评估一个列是一个特定的数据types,只是为了find一个单元格,几乎所有的date在一个单元格中都有“NONE”。

首先要做的两件事情是使用数据读取器而不是数据表。 这可以让你不承担任何事情。

在这个例子中,我认为列A是一个date,而不是假设任何东西,我把它呈现为一个string,并使用DateTime.TryParse来testing它。

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

老实说,我不确定这是否会起作用,但如果您不是1,000%确定这不是内容问题,那么可能值得一试。

显然,这不仅仅是把内容转化为数据表格,还有更多的工作要做,但老实说,我从来没有成为数据表的粉丝。

  1. 我最后的build议 – 可能使用Interop将文件导出为CSV并以此方式加载。 这不是一个很好的build议,因为你正在创build一个Excel的依赖,这可能是第一个问题的一部分。