0

訪問者のサインインに使用されるキオスクがあります。訪問者がサインインすると、データがSQLデータベースに送信されます。次に、このデータをデータセットにプルし、次に監視アプリケーションのdatagridviewにプルします。このデータは15秒ごとに更新されます。

毎回すべてのデータを取得せずに、このデータセット/ 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;
}
4

1 に答える 1

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();
}

そして、新しい 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();
}

あなたはあなたが望むものを手に入れるでしょう。いくつかのポインター: エラーが発生した場合に確実に conn が破棄されるように、try ... catch ブロックが必要です。次回の読み取り時間は最大 (LastChange) から取得されるため、クエリは LastChange による順序に依存します。クライアントの時刻がサーバーの時刻と完全に一致していない場合にレコードが失われる可能性を回避するために、サーバーからの日時を使用します。

于 2012-05-21T14:39:30.977 に答える