Sql 适配器。如何更新没有主键的 DataTable
Posted
技术标签:
【中文标题】Sql 适配器。如何更新没有主键的 DataTable【英文标题】:Sql Adapter . How to update a DataTable with no primary keys 【发布时间】:2013-06-25 00:47:34 【问题描述】:我创建的这张表没有主键。没有键创建它是有原因的。它类似于产品和客户关系表。因此,在使用SqlDataAdapter
和DataSet
以及DataTable
填充DataGrid
的标准程序之后,我更新更改时出错。
我一直在使用DataGrid' but they all work fine due to the fact the table have primary keys. I tried adding a composite key but it didn't work. So below is my code for the
DataSet` 和适用于其他表单的更新代码处理几种表单。
更新代码:
cmdbuilder = New SqlCommandBuilder(adapter)
If primaryDS IsNot Nothing Then
primaryDS.GetChanges()
'update changes
adapter.Update(primaryDS)
MsgBox("Changes Done")
'refresh the grid
CMDrefresh()
End If
这是DataTable
的编码,我尝试添加 5 个复合键。那么如何更新这个问题呢?
Try
myconnection = New SqlConnection(strConnection)
myconnection.Open()
adapter = New SqlDataAdapter(StrQuery, myconnection)
adoPrimaryRS = New DataSet
adapter.Fill(primaryDS)
Dim mainTable As DataTable = primaryDS.Tables(0)
DataGrid.AutoGenerateColumns = False
mainTable.PrimaryKey = New DataColumn() mainTable.Columns(0), _
mainTable.Columns(1), _
mainTable.Columns(2), _
mainTable.Columns(3), _
mainTable.Columns(4)
bndSrc.DataSource = mainTable
DataGrid.DataSource = bndSrc
gDB.Connection.Close()
Catch ex As Exception
MsgBox(ex.Message)
End Try
【问题讨论】:
错误是什么?你能发布完整的代码吗(看起来你的第二组是一个 Try Catch 块,但是缺少 Try 语句(可能还有其他代码)。另外,你有DataGrid.DataSource = bndSrc
- 那不应该是 grdDataGrid.DataSource = bndSrc
吗?
好的,我的连接没有问题,我可以查看网格就好了,只是数据库中的表没有主键。所以我不能更新也不能删除。所以我所做的是我向“DataTable”添加了 5 个复合键,以确保我可以执行上面的更新过程,但它不起作用,因为适配器的原始语句没有检索任何 ID 或键列。
你肯定需要一个主键。您可以通过简单地使用两个值的复合键在“连接”或“相交”表(例如您的 productscustomers)上定义一个 pk。
我无法进入并弄乱数据库。
@peterG 声明了数据表复合键,但是对于数据库中的 Sql 表,行可以重复不要怪我我没有做数据库,事实上数据库是 10 年前完成的。它最近才从 ADODB 转换为 SQl。
【参考方案1】:
所以我决定继续回答我的问题。您不能使用上面的代码 up 但您仍然可以插入新行。由于数据集是一个内存,如果整个数据库被删除,它就不会生效。因此,如何更新没有主键或复合键的表的答案是为了将其截断,然后将数据集表中的所有行插入其中。这是 Trancute 的代码,下面是插入的代码。有了这些,表格就获得了新的价值。这个对我有用。
Dim con As New SqlConnection
Dim cmd As New SqlCommand
con.ConnectionString = strConnection
Dim strSql As String
'MsgBox(con.ConnectionString.ToString)
Try
con.Open()
cmd = New SqlCommand
cmd.Connection = con
strSql = "TRUNCATE TABLE Table1"
cmd.CommandText = strSql
cmd.ExecuteNonQuery()
cmd.Dispose()
cmd = Nothing
con.Close()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
所以这里是插入代码。
Dim con As New SqlConnection
Dim cmd As New SqlCommand
Dim strSql As String
con.ConnectionString = strConnection
For i As Integer = 0 To grdDataGrid.Rows.Count - 1
'MsgBox(con.ConnectionString.ToString)
con.Open()
cmd = New SqlCommand
cmd.Connection = con
Try
strSql = "INSERT INTO Table1 ( [one], [two], [three], [four], [five] )" +_
"VALUES (@one, @two, @three ,@four ,@five )"
cmd.CommandText = strSql
cmd.Parameters.AddWithValue("@one", grdDataGrid.Rows(i).Cells(2).Value)
cmd.Parameters.AddWithValue("@two", grdDataGrid.Rows(i).Cells(0).Value)
cmd.Parameters.AddWithValue("@three", grdDataGrid.Rows(i).Cells(1).Value)
cmd.Parameters.AddWithValue("@four", grdDataGrid.Rows(i).Cells(3).Value)
cmd.Parameters.AddWithValue("@five", grdDataGrid.Rows(i).Cells(4).Value)
cmd.ExecuteNonQuery()
cmd.Dispose()
cmd = Nothing
con.Close()
Catch ex As Exception
MsgBox(ex.Message)
End Try
Next
CMDrefresh()
【讨论】:
以上是关于Sql 适配器。如何更新没有主键的 DataTable的主要内容,如果未能解决你的问题,请参考以下文章