[英]Read Excel file with OleDB c#, when it is used by other process
我试图每 2 秒读取一个 excel 文件,该文件正在被其他 RTD 应用程序更新。
我可以通过 Oledb 连接读取此文件,但是当我尝试每 2 秒读取一次时出现问题。 在 10 次尝试中,它只能读取 4-5 次,而在其他尝试中,它会引发异常。
连接字符串
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\nids\shes.xlsm;Extended Properties="Excel 12.0 Macro;HDR=Yes;IMEX=1"
代码
//opening connection to excel file
using (OleDbConnection connection = new OleDbConnection(constr))//constr = connection string
{
try
{
connection.Open();
isconopen = true;
}
catch
{
dispatcherTimer2.Start();
connection.Close();
isconopen = false;
}
// If connection is ok , then query sheet
if (isconopen == true)
{
strcon = "SELECT * FROM [" + dsheet + "]";
using (OleDbDataAdapter adapter = new OleDbDataAdapter(strcon, connection))
{
try
{
adapter.Fill(result);
isread = true;
adapter.Dispose();
connection.Close();
}
catch
{
isread = false;
dispatcherTimer2.Start();
adapter.Dispose();
connection.Close();
}
}
}
//if able to retrieve data then call some other function
if (isread == true)
{
converToCSV(0);// for further processing
}
请帮助我,我从过去 1 个月开始尝试这个。 请帮帮我
可悲的是,OleDB 驱动程序默认情况下会以独占方式打开文件,然后当它被其他人使用时您无法打开它,即使只是为了阅读。
两个考虑:
也就是说,我建议您应该先尝试在短暂的暂停后打开它,如果它仍在使用中(并且您不能再等了),那么您可以复制并打开它。
让我假设您在HandlExcelFile()
函数中有您的代码:
void HandleExcelFile(string path)
{
try
{
// Function will perform actual work
HandleExcelFileCore(path);
}
catch (Exception) // Be more specific
{
Thread.Sleep(100); // Arbitrary
try
{
HandleExcelFileCore(path);
}
catch (Exception)
{
string tempPath = Path.GetTempFileName();
File.Copy(path, tempPath);
try
{
HandleExcelFileCore(tempPath);
}
finally
{
File.Delete(tempPath);
}
}
}
}
代码有点难看,所以只需将其视为编写自己的函数的起点。
注意事项:
未经测试的解决方案:
我没有尝试过,所以你必须自己做。 实际上(我最初错了)您可以打开只读连接(通过扩展属性)。 如果这仅适用于连接或文件句柄和连接,则没有记录。 无论如何,让我们尝试将您的连接字符串更改为:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\nids\shes.xlsm;Extended Properties="Excel 12.0 Macro;HDR=Yes;IMEX=1;ReadOnly=true"
刚刚在Extended Properties
的末尾添加了ReadOnly=true
。
其他解决方案:
FileSystemWatcher
,只有在通知文件已更改时,您才会读取该文件。不确定,你为什么要以你正在做的方式阅读 excel。
您可以尝试使用LinqToExcel进行 excel 阅读,它是一个用于阅读 excel 文件的不错的小库,如果您需要创建 excel 然后尝试使用EPPLUS库。 我个人发现这些库在使用 Excel 时非常有效
我有类似的问题。 以下修复对我有用
1)不要保持与工作表的联系。 而是打开连接读取数据并立即关闭连接。
2)如果您在非托管应用程序中使用托管代码,则考虑使用托管类型的对象而不是指针(使用 gcnew)并使用堆栈语义确保在对象超出范围时清理内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.