Sql 适配器。如何更新没有主键的 DataTable

Posted

技术标签:

【中文标题】Sql 适配器。如何更新没有主键的 DataTable【英文标题】:Sql Adapter . How to update a DataTable with no primary keys 【发布时间】:2013-06-25 00:47:34 【问题描述】:

我创建的这张表没有主键。没有键创建它是有原因的。它类似于产品和客户关系表。因此,在使用SqlDataAdapterDataSet 以及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 theDataSet` 和适用于其他表单的更新代码处理几种表单。

更新代码:

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的主要内容,如果未能解决你的问题,请参考以下文章

如何创建到没有主键的 SQL 表的映射?

如何生成 sql 命令以使用其他列更新主键

sql怎么设置外键

如何在没有主键的表上按顺序更新表?

使用没有主键的 SQLAdapter 和 SQLCommandBuilder

如何在 SQL Server 或实体框架中创建没有主键的一对多关系?