SqlDataAdapter.Fill(DataGridView.DataSource)复制所有行

时间:2016-11-16 15:59:25

标签: vb.net datagridview sqldataadapter

简单问题:

当我在最初创建第一个数据后第二次调用SqlDataAdapter.Fill(DataGridView.DataSource)时,它不会更新包含的行。它只是将select命令返回的所有行添加到DataGridView中。

如果我把它称为第三个,第四个(等等),它也只是添加返回的行。

我是否理解.Fill(DataTable)函数错误?如何正确更新现有的DataTable?哪一行代码对此负责?

原来它必须是代码问题;

    DataGridView1.AutoGenerateColumns = False
    Dim sql = "select * from myTable"
    oDtSource = New DataTable
    oAdapter = New SqlDataAdapter
    oCon = sqlCon("serverName\Instance", "myDataBase") ' Returns a SqlConnection
    oCmd = New SqlCommand(sql, oCon)
    oCon.Open()

    oDtSource.Clear()

    oAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey
    oAdapter.SelectCommand = oCmd
    oAdapter.Fill(oDtSource)
    DataGridView1.DataSource = oDtSource

要刷新我使用oAdapter.Fill(oDtSource) PrimaryKey在数据库中设置

2 个答案:

答案 0 :(得分:3)

来自MSDN

  

您可以在同一Fill上多次使用DataTable方法。如果一个   存在主键,传入的行与匹配的行合并   已经存在。如果不存在主键,则附加传入行   DataTable

所以要么定义主键,要么先清除表。

Dim table = CType(DataGridView.DataSource, DataTable)
table.Clear()
' fill  ...

要手动定义主键,请阅读this。要让它在数据库中定义时自动创建,您需要将MissingSchemaAction设置为AddWithKey

' ...
dataAdapter.MissingSchemaAction =  MissingSchemaAction.AddWithKey
' fill ...

答案 1 :(得分:2)

edit代码未显示为PrimaryKey定义的DataTable。这将配置DataAdapter以执行更新并启用刷新DataTable。代码使用MySQL,但Provider对象在这方面的工作方式相同:

' persistant form level vars
Private daSample As MySqlDataAdapter
Private dtSample As DataTable
...

其他地方:

' there are caveats with WHERE clauses
Dim sql = "SELECT Id, Name, Country, Animal FROM SAMPLE WHERE Color = 'onyx'"

' using the ctor overload, no need for a DbCommand or Connection object
daSample = New MySqlDataAdapter(sql, MySQLConnStr)

' initialize the CommandBuilder, get other commands 
Dim cbSample = New MySqlCommandBuilder(daSample)

daSample.UpdateCommand = cbSample.GetUpdateCommand
daSample.InsertCommand = cbSample.GetInsertCommand
daSample.DeleteCommand = cbSample.GetDeleteCommand

dtSample = New DataTable()
daSample.FillSchema(dtSample, SchemaType.Source)
dtSample.PrimaryKey = New DataColumn() {dtSample.Columns("id")}

daSample.Fill(dtSample)

dgv1.DataSource = dtSample

要从其他客户端应用程序中获取对数据库所做的更改:

daSample.Fill(dtSample)

初始显示:

enter image description here

从UI浏览器将行更改为“onyx”后,Update显示更改的行:

enter image description here

WHERE条款可能有点问题。由于它限制了撤回的数据子集,Update仅用于比较 new 结果集中的行。因此,如果我将onlyx行更改为“蓝色”,则不会将其删除。

一种解决方案是在表上使用.DefaultView.RowFilter,但这会降低速度,因为它需要将所有行返回到客户端以进行过滤。它并不完美。