我有一个用于访客登录的信息亭,当他们登录时会将数据发送到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;
}
答案 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)。如果客户端时间与服务器时间不完全一致,则使用服务器的日期时间以避免丢失记录的可能性。