如何从sql查询刷新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

我有一个填充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.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)`