2016-11-29 54 views
2

Currectly我正在學習和學習,我只是想知道在C#中的這種數據庫連接的一些邏輯。我想知道爲什麼使用while循環我的意思是如果我不使用它,它會影響程序,或者如果我將它取出,程序運行良好。我只是想知道使用它還是從程序中拿出來是明智的。有人可以幫幫我嗎 ??謝謝爲什麼while循環用於此數據庫連接?

private bool filled; 
    public DataSet ds = new DataSet(); 

    private void bnt_displaylog_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      string dbconnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Elevator_Database.accdb;"; 
      string dbcommand = "Select * from Log;"; 
      OleDbConnection conn = new OleDbConnection(dbconnection); 
      OleDbCommand comm = new OleDbCommand(dbcommand, conn); 
      OleDbDataAdapter adapter = new OleDbDataAdapter(comm); 

      conn.Open(); 
      //MessageBox.Show("Connection Open ! "); 
      **while (filled == false)** 
      { 
       adapter.Fill(ds); 
       filled = true; 
      } 

      conn.Close(); 
     } 
     catch (Exception) 
     { 
      MessageBox.Show("Can not open connection ! "); 
      string message = "Error in connection to datasource"; 
      string caption = "Error"; 
      MessageBoxButtons buttons = MessageBoxButtons.OK; 
      DialogResult result; 
      result = MessageBox.Show(message, caption, buttons); 
     } 

     database_listbox.Items.Clear(); 
     foreach (DataRow row in ds.Tables[0].Rows) 
     { 
      database_listbox.Items.Add(row["Date"] + "\t\t" + row["Time"] + "\t\t" + row["Action"]); 
     } 

    } 
+1

似乎它可以很容易地用'if(!filled)...'替換,除非有其他方法訪問'filled'變量。 – foxanna

+0

我們是否需要循環或如果?看起來程序工作正常,只有這部分「adapter.Fill(ds);」 – Dee21

+1

是的,如果我們想要保持現在的相同行爲,那麼仍然需要'if'。這個代碼第一次運行時,'filled'是'false'。但是代碼運行的* next *時間,'filled'將是'true',除非其他代碼已將其設置回'false'。因此,代碼原樣 - 或更改爲'if' - 只在第一次點擊時運行'adapter.Fill(ds);'。 –

回答

4

這只是以非常不清楚的方式編寫的代碼。循環將永遠不會循環。循環體將執行一次,或根本不執行,具體取決於filled的值。

換句話說,代碼可以被寫成更清楚的是:

conn.Open(); 
if(! filled) 
{ 
    adapter.Fill(ds); 
    filled = true; 
} 
conn.Close(); 

但即便如此,代碼是做錯誤的事情。想想filledtrue的情況。實際執行的代碼是:

conn.Open(); 
conn.Close(); 

這樣做的意義何在?

在任何情況下,代碼實際執行的操作(whileif)僅在第一次通過時調用adapter.Fill(ds)。鑑於此,我們應該在我們不打電話時完全避免建立連接。讓我們重構代碼,讓它多一點明確:

private bool filled = false; 
public DataSet ds = new DataSet(); 

private void bnt_displaylog_Click(object sender, EventArgs e) 
{ 
    loadDisplayLog(); 

    database_listbox.Items.Clear(); 
    foreach (DataRow row in ds.Tables[0].Rows) 
    { 
     database_listbox.Items.Add(
      row["Date"] + "\t\t" + row["Time"] + "\t\t" + row["Action"] 
     ); 
    } 

} 

private void loadDisplayLog(object sender, EventArgs e) 
{ 
    if(filled) return; 

    try 
    { 
     string dbconnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Elevator_Database.accdb;"; 
     string dbcommand = "Select * from Log;"; 
     OleDbConnection conn = new OleDbConnection(dbconnection); 
     OleDbCommand comm = new OleDbCommand(dbcommand, conn); 
     OleDbDataAdapter adapter = new OleDbDataAdapter(comm); 

     conn.Open(); 
     adapter.Fill(ds); 
     conn.Close(); 

     filled = true; 
    } 
    catch (Exception) 
    { 
     MessageBox.Show("Can not open connection ! "); 
     string message = "Error in connection to datasource"; 
     string caption = "Error"; 
     MessageBoxButtons buttons = MessageBoxButtons.OK; 
     DialogResult result; 
     result = MessageBox.Show(message, caption, buttons); 
    } 
} 

還存在一些問題與例外此代碼處理 - 將連接來如果adapter.Fill(ds);拋出一個異常關閉?哎呀。但我將剩下的作爲讀者的練習...

+0

即使'adapter.Fill'運行在不同的線程上,這是真的。它只是將盡快完成循環 – BradleyDotNET

+0

啊,你說得對,當然,因爲'filled = true;'是循環中的最後一個語句。編輯刪除關於主題的評論,謝謝! –

+0

謝謝你更清楚thaks很多:) – Dee21