我有一个循环遍历excel和csv文件集合的过程,并将数据拉回到数据表中进行处理:
public static DataTable Get(string path, bool IsFirstRowHeader)
{
var header = "No";
var sql = string.Empty;
DataTable dataTable = null;
var pathOnly = string.Empty;
var fileName = string.Empty;
try
{
pathOnly = Path.GetDirectoryName(path);
fileName = Path.GetFileName(path);
sql = @"SELECT * FROM [" + fileName + "]";
if (IsFirstRowHeader) { header = "Yes"; }
using (var connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=1;';"))
{
using (var command = new OleDbCommand(sql, connection))
{
using (var adapter = new OleDbDataAdapter(command))
{
dataTable = new DataTable {Locale = CultureInfo.CurrentCulture};
adapter.Fill(dataTable);
}
}
}
}
catch(Exception ex)
{
ErrorLog.Log();
}
return dataTable;
}
但是,如果用户正在查看此内容,则会收到以下错误:
The Microsoft Jet database engine cannot open the file
'\\cjserver\IS_CalendarImport\Staging\12-03-13done'. It is already opened exclusively
by another user, or you need permission to view its data.
是否有办法(最好在代码中,C#)自动释放或绕过锁?
答案 0 :(得分:2)
理论上,通过Windows内部函数等,是的,可以杀死锁 - 事实上,unlocker utility就是这样做的。但是,在一般情况下,这是不明智的,因为程序不希望锁定因外部过程而神奇地消失。
测试文件以确定在尝试使用它之前是否可以打开它是一个很好的策略(尝试直接在c#代码中打开文件)。
如果您无法在c#代码中打开该文件,则可以遵循以下策略之一:
1)只需跳过文件 - 也许跳过跳过的文件的信息用户,管理员等 2)稍后重试该文件,在重试太多后恢复跳过查杀而没有成功 3)当我打字时,我看到DarrenMB已经建议复制文件 - 而是使用副本。
答案 1 :(得分:1)
不知道如何用Jet规避锁定(可能无法实现),但在大多数情况下,您可以在文件使用时复制该文件。
因此,一个简单的解决方法是将文件复制到临时目录中,并根据临时文件查询数据。