从sql C#更新数据集

时间:2012-05-21 13:29:26

标签: sql c#-4.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;
}

1 个答案:

答案 0 :(得分: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();
}

你会得到你想要的。几个指针:确实应该有一个尝试... catch块以确保在出现错误时配置conn。查询取决于LastChange的顺序,因为下一个读取时间取自最大值(LastChange)。如果客户端时间与服务器时间不完全一致,则使用服务器的日期时间以避免丢失记录的可能性。