我写了一个方法来读取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 后 是否要做其他的处理 才能再次使用啊?

解决方案 »

  1.   

    你可以使用
    finally
    {
    OleDbconn.Close();
    OleDbconn.Dispose();
    }或者试试把代码放在
    using()里面
      

  2.   

    楼上的意思是加上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;
    }
      }
      

  3.   

    是因为你没有关闭打开的excel文件 或者进程中已经打开起excel的
     /// <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关闭后就能再次导入了
      

  4.   

    OleDbconn.Close();
      OleDbconn.Dispose();
    之后,就应该释放了,
    你断定是这个地方的代码导致的?