在生产系统上,我们 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文档但是第二天相同的代码相同的文件没有任何问题。 有人可以帮帮我吗?
答案 0 :(得分:1)
一些建议。
如果您运行的内容非常简单,它将清除所有打开的实例,即使是那些您无法看到的实例:
foreach (var process in Process.GetProcessesByName("Excel"))
{
process.Kill();
}
这将意味着您需要更多的工作来阅读内容并将其转换为数据表,但它也创造了一个机会,可以将数据表全部跳过,这可能是有意义的,具体取决于您要执行的操作。< / p>
首先要尝试的两件事是,首先使用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%确定它不是内容问题,那么它可能值得一试。
显然,这不仅仅是将内容砸到数据表中,而且说实话,我从来都不是数据表的粉丝。