如何从sql查询刷新datagrid
我有一个填充datagrid的函数如何从sql查询刷新datagrid,sql,wpf,datagrid,Sql,Wpf,Datagrid,我有一个填充datagrid的函数 Public Sub GridMiner() 'check summary and database Try con.Open() sql = "Select roomnumber AS [Room], [end] AS [Check out at], hours as [on] FROM rooms where [end] between ? and ?" cmd = New OleDb.Ole
Public Sub GridMiner()
'check summary and database
Try
con.Open()
sql = "Select roomnumber AS [Room], [end] AS [Check out at], hours as [on] FROM rooms where [end] between ? and ?"
cmd = New OleDb.OleDbCommand(sql, con)
cmd.Parameters.AddWithValue("@from", Now.AddDays(0).ToString("MM/dd/yyyy"))
cmd.Parameters.AddWithValue("@to", Now.AddDays(1).ToString("MM/dd/yyyy"))
da = New OleDb.OleDbDataAdapter(cmd)
da.Fill(ds)
gridSummary.DataSource = ds.Tables(0)
da = Nothing
con.Close()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
它填充名为gridSummary的数据网格
现在,当我将一些数据从不同的表单保存到数据库表时,我的datagrid不会刷新其值,我决定创建一个刷新按钮
Private Sub btnRefresh_Click(sender As Object, e As EventArgs) Handles btnRefresh.Click
GridMiner()
End Sub
它不会刷新我的datagrid上的数据,而是添加相同的内容及其新数据。您需要定义主键才能正确合并表 “如果存在主键信息,则任何重复的行都会被协调,并且在与数据集对应的数据表中只出现一次。可以通过FillSchema、指定数据表的PrimaryKey属性或将MissingSchemaAction属性设置为AddWithKey来设置主键信息。”- 因此,通过在
da.Fill(ds)
之前调用FillSchema
,将确保数据集具有正确的模式
da.FillSchema(ds, SchemaType.Source)
好的,感谢@LordTakker和所有发表评论的人 我通过新的数据集找到了答案,它成功了。见代码:
Private Sub btnRefresh_Click(sender As Object, e As EventArgs) Handles btnRefresh.Click
Try
con.Open()
sql = "Select roomnumber AS [Room], [end] AS [Check out at], hours as [on] FROM rooms where [end] between ? and ?"
cmd = New OleDb.OleDbCommand(sql, con)
cmd.Parameters.AddWithValue("@from", Now.AddDays(0).ToString("MM/dd/yyyy"))
cmd.Parameters.AddWithValue("@to", Now.AddDays(1).ToString("MM/dd/yyyy"))
da = New OleDb.OleDbDataAdapter(cmd)
da.Fill(ds)
gridSummary.DataSource = ds.Tables(0)
datatb = New DataTable()
datatb.Load(cmd.ExecuteReader())
gridSummary.DataSource = datatb
da = Nothing
con.Close()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
现在这个工作开始了。谁能告诉我这是不是最好的做法
根据Bjørn Roger Kringsjå
使用此解决方案,您将不得不处理表的两个实例。datatb和ds.表(0)。另外,您将加载两次表,da.Fill(ds)和datatb.Load(cmd.ExecuteReader())。而且,更改网格的数据源会丢失用户所做的所有选择
因此,我将上述代码编辑为:
Public Sub btnRefresh_Click(sender As Object, e As EventArgs)
Try
con.Open()
sql = "Select roomnumber AS [Room], [end] AS [Check out at], hours as [on] FROM rooms where [end] between ? and ?"
cmd = New OleDb.OleDbCommand(sql, con)
cmd.Parameters.AddWithValue("@from", Now.AddDays(0).ToString("MM/dd/yyyy"))
cmd.Parameters.AddWithValue("@to", Now.AddDays(1).ToString("MM/dd/yyyy"))
datatb = New DataTable()
datatb.Load(cmd.ExecuteReader())
gridSummary.DataSource = datatb
da = Nothing
con.Close()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
你试过在数据网格上调用DataBind吗?你没有试过this.YourDataGrid.Refresh()代码>?gridSummary.DataSource=null gridSummary.DataSource=ds.Tables(0)@LordTakkera怎么做?我的函数用于在线sql,这就是为什么我不使用databind,如果我错了,请纠正我,但databind在datagrid上使用,对吗?我不知道如何使用数据绑定。@MarkLaREZZA这样做了,但什么也没发生。您好,我不会合并任何数据。如果您在同一个ds
和dt
上多次调用fill,那么它确实是在合并我的朋友。我已更正。然而,我不希望它们被合并,我只需要它们刷新。我已经创建了上面刷新按钮的答案。我做得对吗?像在Ops中那样绑定源代码?很抱歉,我用了一个新的数据集来代替,它成功了。我在这里读到()使用这个解决方案,您的表有两个实例datatb
和ds.表(0)
。另外,您将加载两次表,da.Fill(ds)
和datatb.Load(cmd.ExecuteReader())
。而且,通过更改网格的数据源,您将丢失用户所做的所有选择。如果您的表有主键,请参阅我的解决方案。如果没有,请在填充之前清除表,并接受后面的更改。好的,我已将da.FillSchema(ds,SchemaType.Source)
应用于我的代码替换,并收到此错误OledbCommand.Prepare方法要求所有参数都有一个显式的类型集。
注意:我在da.fills(ds)
之前的GridMiner()中添加了这个。这不管用。另外,我在我的按钮刷新(这是我当前的解决方案)中删除了da.Fill(ds)
和`gridSummary.DataSource=ds.Tables(0)`