在生产系统中,我们有时是,有时在将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)
但问题是,在生产服务器上,它今天工作得很好,但是明天或后天,它将不能正常工作,然后它就会开始工作得很好。
下面是密码。
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文档,但第二天相同的代码相同的文件工作没有任何问题。有人能帮我吗?
发布于 2017-11-26 02:26:13
几点建议。
如果运行像这样简单的东西,它将清除任何打开的实例,甚至那些您看不到的实例:
foreach (var process in Process.GetProcessesByName("Excel"))
{
process.Kill();
}这将意味着您需要完成更多的工作来读取内容并将其转换为datatable,但它也为跳过datatable提供了一个机会,这可能是有意义的,这取决于您要做的是什么。
这里要尝试的两件事首先是,使用datareader而不是datatable。这允许你不去假设任何事情。
在本例中,我认为列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();老实说,我不确定这是否有效,但如果你不确定这不是一个内容问题的话,也许值得一试。
显然,这不仅仅是将内容猛击到datatable中所做的工作,但老实说,我从来都不是数据存储的粉丝。
https://stackoverflow.com/questions/47455238
复制相似问题