2016-12-10 55 views
-2

閱讀我有嘗試從MS Access數據庫逐行讀取並在屏幕上顯示它時,每個顯示之間有睡眠幾秒鐘的一個爛攤子如何延遲我的計劃。而從數據庫C#

我使用System.Threading,你可以看到,但它似乎在睡覺時發生的程序顯示的記錄,並在睡眠結束只有最後一條記錄,而不顯示以前的顯示之前。

這是我的代碼,我會很感激任何幫助!

private void com_start_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     string ConString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\MyBrainWash\Englishdb.accdb;"; 

     OleDbConnection Con = new OleDbConnection(ConString); 
     Con.Open(); 

     check_connection.Text = "succeeded"; 

     OleDbCommand command = new OleDbCommand(); 
     command.Connection = Con; 
     command.CommandText = "Select * From words"; 

     OleDbDataReader reader = command.ExecuteReader(); 

     if (reader.HasRows) 
     { 
      while (reader.Read()) 
      { 
       lab_word.Text = reader["word"].ToString(); 
       lab_definition.Text = reader["definition"].ToString(); 
       Thread.Sleep(30000); 
      } 
     } 

     reader.Close(); 
     Con.Close(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show("Error " + ex); 
    } 
} 
+1

當你睡你的UI線程睡眠異步方法。然後屏幕上沒有任何更新。你需要一個計時器或其他更好的辦法。 'Thread.Sleep()'幾乎總是做錯的事情。 –

+0

我可以建議簡單地從數據庫中讀取所有數據,並簡單地延遲顯示您的信息嗎? – Fang

+0

相關:http://stackoverflow.com/questions/20849979/how-to-make-oledb-code-run-asynchronous –

回答

1

UI控件lab_wordlab_definition.Text將後整個com_start_Click方法完成更新。
這就是爲什麼你看到只顯示最後一行。

你需要閱讀每行3秒後用新值更新UI控件後的「釋放」 UI線程。

我覺得async/await方法適合非常好這一目的。
標記按鈕點擊async關鍵字。

private async void com_start_Click(object sender, EventArgs e) 
{ 
    string ConString = 
     @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\MyBrainWash\Englishdb.accdb;"; 
    using (var Con = new OleDbConnection(ConString)) 
    { 
     Con.Open(); 
     check_connection.Text = "successed"; 
     using (var command = new OleDbCommand()) 
     { 
      command.Connection = Con; 
      command.CommandText = "Select * From words"; 
      using (var reader = command.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        lab_word.Text = reader["word"].ToString(); 
        lab_definition.Text = reader["definition"].ToString(); 
        await Task.Delay(30000); 
       } 
      } 
     } 
    } 
} 

您還可以使用的OleDbConnectionOleDbCommandOleDbReader

private async void com_start_Click(object sender, EventArgs e) 
{ 
    string ConString = 
     @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\MyBrainWash\Englishdb.accdb;"; 
    using (var Con = new OleDbConnection(ConString)) 
    { 
     await Con.OpenAsync(); 
     check_connection.Text = "successed"; 
     using (var command = new OleDbCommand()) 
     { 
      command.Connection = Con; 
      command.CommandText = "Select * From words"; 
      using (var reader = await command.ExecuteReader()) 
      { 
       while (await reader.ReadAsync()) 
       { 
        lab_word.Text = reader["word"].ToString(); 
        lab_definition.Text = reader["definition"].ToString(); 
        await Task.Delay(30000); 
       } 
      } 
     } 
    } 
} 
+0

感謝解釋com_start_Click method.I想你的第一個解決方案,但我不想點擊我想移動到下一條記錄每次。我希望它自動。@ fabio – user6497813

+0

它自動工作 - 使延遲量更小 – Fabio

+0

你是對的!我的錯誤,我看到它成千上萬:) @fabio – user6497813