公司有个老项目,用到Oledb读取htm/excel文件,系统部署到服务器后,时常会出现读取文件时报这个错误:System.Data.OleDb.OleDbException: Microsoft Office Access 数据库引擎无法打开文件“”或无法向其写入数据。它已经被其他用户以独占方式打开,或者您没有查看或写入其数据的权限。
代码如下:
public static DataTable ExcelToDataTable(string strExcelFileName, string strSheetName)
{
DataTable dt = null;
OleDbConnection conn = null;
OleDbDataAdapter adapter = null;
try
{
string strConn = "Provider=Microsoft.ACE.OleDb.12.0;" + "Data Source=" + strExcelFileName + ";" + "Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";
DataSet ds = new DataSet();
using (conn = new OleDbConnection(strConn))
{
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
DataTable dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" });
string strExcel = string.Format("SELECT * FROM [{0}]", dtSheetName.Rows[0]["TABLE_NAME"].ToString());
adapter = new OleDbDataAdapter(strExcel, strConn);
adapter.Fill(ds, strSheetName);
adapter.Dispose();
conn.Close();
conn.Dispose();
}
dt = ds.Tables[strSheetName];
}
catch (Exception ex)
{
CommonMessage.SaveExLog(strExcelFileName+Environment.NewLine+ex.Message + Environment.NewLine + ex.StackTrace, "debug.log");
}
finally
{
if (conn != null && conn.State == ConnectionState.Open)
{
conn.Close();
adapter.Dispose();
conn.Dispose();
}
}
return dt;
}
大家帮忙看看是哪的问题,谢谢了!!
被多次使用,问题已经明确。即使这代码是正确的,但使用不当一样出现该错误,当然也可能比如access等软件占用等。
读取的是excel文件,每次上传一个压缩包,然后把压缩包解压到一个新文件夹里,然后再读取新文件夹里的excel文件,这样还会独占吗,谢谢了?
@yanhuanghero: 你说呢~你这样说了跟没说没区别啊。代码写对了肯定不会独占,比如你解压后这个文件未释放那被占了没有?
@花飘水流兮: 恩,解压缩时文件释放了,我再找找原因吧,就这有时出问题,有时不出问题,不好查原因