简单问题:
当我在最初创建第一个数据后第二次调用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在数据库中设置
答案 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)
初始显示:
从UI浏览器将行更改为“onyx”后,Update
显示更改的行:
WHERE
条款可能有点问题。由于它限制了撤回的数据子集,Update
仅用于比较 new 结果集中的行。因此,如果我将onlyx
行更改为“蓝色”,则不会将其删除。
一种解决方案是在表上使用.DefaultView.RowFilter
,但这会降低速度,因为它需要将所有行返回到客户端以进行过滤。它并不完美。