2012-05-21 125 views
0

我有一個用於訪問者登錄的信息亭,當他們登錄時發送數據到SQL數據庫。然後我將這些數據放入一個數據集中,然後放入監視應用程序的datagridview中。這些數據每15秒刷新一次。更新數據庫從sql C#

如何更新此數據集/ datagridview而不必每次都抓取所有數據?最初的拉力約爲500線,我不想每次都拉500。我想檢查是否有新記錄並將它們添加到數據集中。

這裏就是我得到的數據的代碼

private void UpdateUsers() 
    { 
     SqlConnection conn = ConnectSQL("10.100.25.250", "bhi_kiosk"); 
     var query = new SqlCommand("SELECT * FROM Users WHERE uStatus=1", conn); 
     SqlDataReader read = null; 
     listView1.Items.Clear(); 

     conn.Open(); 
     read = query.ExecuteReader(); 
     var dt = new DataTable(); 
     dt.Load(read); 
     query.Connection.Close(); 
     dataGridView1.DataSource = dt; 
} 
+0

所以你想從服務器獲取更新的數據(這樣你就可以在datagridview中顯示它),而無需在服務器上運行查詢?是對的嗎?只要確保我沒有誤讀這個問題。 – David

+1

保持跟蹤最後一個查詢時間,然後將您的查詢更改爲'SELECT * FROM Users WHERE uStatus = 1 AND signInTime> @ lastRunTime' – Paddy

+0

您是說當他們登錄時,您提取所有數據,然後從該點轉發,你想保持什麼沒有更新,只得到新的東西?你想拉入的東西是更新記錄和新記錄還是隻是新記錄? – Yatrix

回答

2

如果你在一開始加載數據:

DataTable dt = new DataTable(); 
DateTime lastChange = new DateTime(1753, 1, 1); 
protected override void OnLoad(EventArgs e) 
{ 
    base.OnLoad(e); 
    dataGridView1.DataSource = dt; 
    UpdateUsers(); 
} 

然後merge新的DataTable到老:

private void UpdateUsers() 
{ 
    SqlConnection conn = ConnectSQL("10.100.25.250", "bhi_kiosk"); 
    var query = new SqlCommand("SELECT * FROM Users WHERE uStatus=1 AND LastChange > @LastChange ORDER BY LastChange", conn); 
    var lastChangeparameter = query.Parameters.Add("@LastChange", SqlDbType.DateTime); 
    lastChangeparameter.Value = lastChange; 
    //listView1.Items.Clear(); 
    conn.Open(); 
    using (SqlDataReader read = query.ExecuteReader()) 
    { 
     using (var dt_merge = new DataTable()) 
     { 
      dt_merge.Load(read); 
      dt.Merge(dt_merge); 
      if (dt.Rows.Count > 0) 
      { 
       lastChange = (DateTime)dt.Rows[dt.Rows.Count - 1]["LastChange"]; 
      } 
     } 
    } 
    conn.Close(); 
} 

你會得到你想要的。幾個指針:確實應該有一個try ... catch塊來確保conn在出錯的情況下處理。查詢取決於LastChange的順序,因爲下次讀取時間取自最大值(LastChange)。如果客戶端時間與服務器時間不完全一致,則可以使用服務器的日期時間來避免丟失記錄。

+0

我不能保證代碼是準確的,但他的想法是現貨。 – Yatrix

+0

這工作完美!謝謝! –

+0

太好了。不用謝 :-) –