我写了一个方法来读取excel表,
在一个应该程序里要读几个excel表,但不是同时
是一个一个的读取。
第一个excel能正常的读取,等到第二个excel表时就会出一个异常
异常信息如下:
Microsoft Jet 数据库引擎打不开文件''。 它已经被别的用户以独占方式打开,或没有查看数据的权限。我的方法代码如下:
public ArrayList ReadExcel(string fileName)
{
ArrayList dataTable = new ArrayList();
try
{
string connStr = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = " + fileName + ";" + "Extended Properties = \"Excel 8.0;HDR=No;IMEX=1\";";
OleDbConnection OleDbconn = new OleDbConnection(connStr);
OleDbconn.Open();
string sql = "SELECT * FROM [Sheet1$]";
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(sql, OleDbconn);
DataSet ds = new DataSet();
dataAdapter.Fill(ds);
if (ds.Tables.Count == 1)
{
System.Data.DataTable table = ds.Tables[0];
foreach (DataRow row in table.Rows)
{
ArrayList dataRow = new ArrayList();
foreach (DataColumn column in table.Columns)
{
dataRow.Add(row[column].ToString());
}
dataTable.Add(dataRow);
}
}
OleDbconn.Close();
OleDbconn.Dispose();
}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
} return dataTable; }
不知道 使用一次 Microsoft.Jet.OLEDB 后 是否要做其他的处理 才能再次使用啊?
在一个应该程序里要读几个excel表,但不是同时
是一个一个的读取。
第一个excel能正常的读取,等到第二个excel表时就会出一个异常
异常信息如下:
Microsoft Jet 数据库引擎打不开文件''。 它已经被别的用户以独占方式打开,或没有查看数据的权限。我的方法代码如下:
public ArrayList ReadExcel(string fileName)
{
ArrayList dataTable = new ArrayList();
try
{
string connStr = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = " + fileName + ";" + "Extended Properties = \"Excel 8.0;HDR=No;IMEX=1\";";
OleDbConnection OleDbconn = new OleDbConnection(connStr);
OleDbconn.Open();
string sql = "SELECT * FROM [Sheet1$]";
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(sql, OleDbconn);
DataSet ds = new DataSet();
dataAdapter.Fill(ds);
if (ds.Tables.Count == 1)
{
System.Data.DataTable table = ds.Tables[0];
foreach (DataRow row in table.Rows)
{
ArrayList dataRow = new ArrayList();
foreach (DataColumn column in table.Columns)
{
dataRow.Add(row[column].ToString());
}
dataTable.Add(dataRow);
}
}
OleDbconn.Close();
OleDbconn.Dispose();
}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
} return dataTable; }
不知道 使用一次 Microsoft.Jet.OLEDB 后 是否要做其他的处理 才能再次使用啊?
finally
{
OleDbconn.Close();
OleDbconn.Dispose();
}或者试试把代码放在
using()里面
public ArrayList ReadExcel(string fileName)
{
ArrayList dataTable = new ArrayList();
try
{
string connStr = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = " + fileName + ";" + "Extended Properties = \"Excel 8.0;HDR=No;IMEX=1\";";
using(OleDbConnection OleDbconn = new OleDbConnection(connStr))
{
OleDbconn.Open();
string sql = "SELECT * FROM [Sheet1$]";
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(sql, OleDbconn);
DataSet ds = new DataSet();
dataAdapter.Fill(ds);
if (ds.Tables.Count == 1)
{
System.Data.DataTable table = ds.Tables[0];
foreach (DataRow row in table.Rows)
{
ArrayList dataRow = new ArrayList();
foreach (DataColumn column in table.Columns)
{
dataRow.Add(row[column].ToString());
}
dataTable.Add(dataRow);
}
}
OleDbconn.Close();
OleDbconn.Dispose();
}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
} return dataTable;
}
}
/// <summary>
/// 预关闭未退出的Excel进程方法
/// </summary>
public void PreExitExcel()
{
System.Diagnostics.Process[] allProcess = System.Diagnostics.Process.GetProcesses();
foreach (System.Diagnostics.Process thisprocess in allProcess)
{
string processName = thisprocess.ProcessName;
if (processName.ToLower() == "excel")
{
try
{
thisprocess.Kill();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
return;
}
}
}
}把进程中的excel关闭后就能再次导入了
OleDbconn.Dispose();
之后,就应该释放了,
你断定是这个地方的代码导致的?