2015-07-28 62 views
0

我已將我的訪問數據庫連接到我的C#項目。我在數據庫中有1760行,當我嘗試在C#項目中將這些行打印到datagridview時,它給了我一個錯誤,指出程序無法再打開tables.also,它始終不會出現此錯誤。有時它運行正常,完全沒有錯誤。我已經搜索並尋求幫助來解決這個問題,但我陷入了死衚衕,我甚至不明白爲什麼它會給出這個錯誤;我已經調試過千次代碼,但無法看到問題。ms訪問數據庫和C#:無法打開表

我已經把我的程序代碼和錯誤信息的屏幕截圖。

edataGridView1.Rows.Clear(); 
     OleDbConnection c = new OleDbConnection(); 
     c.ConnectionString = "Provider=Microsoft.Ace.Oledb.12.0;Data Source=" + Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\Database.accdb"; 
     using (OleDbCommand cmd = new OleDbCommand(" SELECT * from omed", c)) 
     { 
      c.Open(); 
      OleDbDataReader Reader = cmd.ExecuteReader(); 
      while (Reader.Read()) 
      { 
       DataGridViewRow row = new DataGridViewRow(); 
       row.CreateCells(dataGridView1); // this line was missing 
       row.Cells[0].Value = Reader["ID"].ToString(); 
       row.Cells[1].Value = Reader["CELL"].ToString(); 
       row.Cells[2].Value = Reader["ncc"].ToString(); 
       row.Cells[3].Value = Reader["bcchno"].ToString(); 

       dataGridView1.Rows.Add(row); 
       for (int i = 0; i < 31; i++) 
       { 
        row.Cells[i * 3 + 4].Value = Reader["n_cell_" + i].ToString(); 
        using (OleDbCommand cmd0 = new OleDbCommand(" SELECT * from omed WHERE CELL LIKE '" + Reader["n_cell_" + i].ToString() + "'", c)) 
        { 
         OleDbDataReader Reader0 = cmd0.ExecuteReader(); 
         int counter = 0; 
         while (Reader0.Read()) 
         { 
          row.Cells[i * 3 + 5].Value = Reader0["ncc"].ToString(); 
          row.Cells[i * 3 + 6].Value = Reader0["bcchno"].ToString(); 
         } 
        } 
       } 
      } 
     } 
     c.Close(); 

回答

0

關閉你的讀者在這個循環中,我假設垃圾收集器有時它保持了,有時沒有:

... 
OleDbDataReader Reader0 = cmd0.ExecuteReader(); 
int counter = 0; 
while (Reader0.Read()) 
{ 
    row.Cells[i * 3 + 5].Value = Reader0["ncc"].ToString(); 
    row.Cells[i * 3 + 6].Value = Reader0["bcchno"].ToString(); 
} 
Reader0.Close(); 
... 
0

就像使用Access作爲「數據庫」是不就足夠了,您正在同一連接上使用(不必要的)多個閱讀器。 在同一連接上使用多個閱讀器本身就是一個嚴重的問題。

其次,你根本不需要那個。您在第一次調用中選擇'omed'中的所有行,您不需要往返數據庫就可以從已有結果的同一來源執行更多選擇。

第三,你的內部閱讀器循環,實際上只使用了最後一行,這是不必要的第二次調用,因此一段時間(Reader0.Read())是多餘的。

你的代碼的修訂版看起來是這樣的:

edataGridView1.Rows.Clear();

DataTable tbl = new DataTable(); 
using(OleDbConnection c = new OleDbConnection()) 
using (OleDbCommand cmd = new OleDbCommand("SELECT * from omed", c)) 
{ 
    c.ConnectionString = "Provider=Microsoft.Ace.Oledb.12.0;Data Source=" + 
    Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\Database.accdb"; 

    c.Open(); 
    OleDbDataReader reader = cmd.ExecuteReader(); 
    tbl.Load(reader); 
    c.Close(); 
} 

foreach (DataRow r in tbl.Rows) 
{ 
    DataGridViewRow row = new DataGridViewRow(); 
    row.CreateCells(dataGridView1); // this line was missing 
    row.Cells[0].Value = r["ID"].ToString(); 
    row.Cells[1].Value = r["CELL"].ToString(); 
    row.Cells[2].Value = r["ncc"].ToString(); 
    row.Cells[3].Value = r["bcchno"].ToString(); 
    dataGridView1.Rows.Add(row); 
    for (int i = 0; i < 31; i++) 
    { 
     var v = r["n_cell_" + i].ToString(); 
     row.Cells[i * 3 + 4].Value = v; 
     var resultRow = tbl.AsEnumerable().Last (t => t.Field<string>("CELL").Contains(v)); 
     row.Cells[i * 3 + 5].Value = resultRow["ncc"].ToString(); 
     row.Cells[i * 3 + 6].Value = resultRow["bcchno"].ToString(); 
    } 
}