2012-05-21 3 views
0

방문자 로그인에 사용되는 키오스크가 있는데 로그인 할 때 데이터를 SQL 데이터베이스로 보냅니다. 그런 다음이 데이터를 데이터 집합으로 가져 와서 모니터링 응용 프로그램의 DataGrid 뷰로 가져옵니다. 이 데이터는 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의 순서에 따라 다릅니다. 클라이언트 시간이 서버 시간과 완벽하게 일치하지 않으면 레코드를 잃어 버릴 가능성을 피하기 위해 서버의 datetime을 사용합니다.

+0

정확한 코드를 보증 할 수는 없지만 그의 생각은 확실합니다. – Yatrix

+0

이것은 완벽하게 작동했습니다! 감사! –

+0

좋습니다. 천만에요 :-) –