首页 > 解决方案 > SqlCommandBuilder 更新命令正在生成命令但不从 DataGridView 更新数据库

问题描述

我正在为 Form 2 继承一个表单类 (Form1)。Form 1 代码可以正常工作。在表格 1 中,我使用SqlCommandBuilder(SQL.DBDA).GetUpdateCommand为我的 Datagrid 生成更新命令以传递给 SQL 数据表,该数据表再次完美运行并且表已成功更新。表格 1 更新的 SQL 命令文本如下所示:

图 1

在表格 2 中,我为更新命令编写了以下内容,唯一的区别是选择此处显示的表:

SQL.ExecQuery("SELECT * FROM dtbRateVerse;")
SQL.DBDA.UpdateCommand = New SqlClient.SqlCommandBuilder(SQL.DBDA).GetUpdateCommand
MsgBox(SQL.DBDA.UpdateCommand.CommandText)
SQL.DBDA.Update(SQL.DBDT)

此更新命令的命令文本如下所示:

图 2

它与 Form1 中显示的成功更新命令没有什么不同(图 1)。尽管如此,没有数据从 Gridview 传递到 SQL。

我还尝试在不使用下面显示的命令生成器的情况下编写动态更新语句。该语句的文本生成了一个准确的 SQL 命令,但同样没有传递给数据库。此代码显示在这里:

For i = 1 To colEnd
    colName.Add("[" & DataGridView1.Columns(i).HeaderText.ToString & "]")
Next
For i = 1 To colEnd
    For y = 0 To Me.DataGridView1.RowCount - 1
        For n = 1 To colEnd
            gridVals.Add(DataGridView1.Rows(y).Cells(n).Value.ToString)
        Next
        With Me.DataGridView1
            SQL.AddParam("@PrimKey", .Rows(y).Cells(0))
            cmdUpdate = "UPDATE " & tbl_Name & " SET " & colName.Item(i - 1) & "=" & gridVals.Item(i - 1) & " WHERE ID=@PrimKey;"
            SQL.ExecQuery(cmdUpdate)
        End With
    Next
Next

如果有人对我需要做什么以使更新命令正常工作有任何想法/解决方案,我将不胜感激。谢谢!

在下面为每个请求添加了 ExecQuery 方法:

Public Class SQLControl
    Private DBConnect As New SqlConnection("SERVER STRING HERE")
    Private DBCmd As SqlCommand

    'DB DATA
    Public DBDA As SqlDataAdapter
    Public DBDT As DataTable

    'QUERY PARAMETERS
    Public Params As New List(Of SqlParameter)

    'QUERY STATISTICS
    Public RecordCount As Integer
    Public Exception As String

    Public Sub New()
    End Sub

    'ALLOW CONNECTION STRING OVERRIDE
    Public Sub New(ConnectionString As String)
        DBConnect = New SqlConnection(ConnectionString)
    End Sub

    'EXECUTE QUERY SUB
    Public Sub ExecQuery(Query As String)
        'RESET QUERY STATS
        RecordCount = 0
        Exception = ""

        Try
            DBConnect.Open()
            'CREATE DATABASE COMMAND
            DBCmd = New SqlCommand(Query, DBConnect)

            'LOAD PARAMS INTO DB COMMAND

            Params.ForEach(Sub(p) DBCmd.Parameters.Add(p)) 'LAMBDA EXPRESSION

            'CLEAR PARAMS LIST
            Params.Clear()

            'EXECUTE COMMAND & FILL DATASET
            DBDT = New DataTable
            DBDA = New SqlDataAdapter(DBCmd)
            RecordCount = DBDA.Fill(DBDT)

        Catch ex As Exception
            'CAPTURE ERROR
            Exception = "ExecQuery Error: " & vbNewLine & ex.Message
        Finally
            'CLOSE CONNECTION
            If DBConnect.State = ConnectionState.Open Then DBConnect.Close()
        End Try

    End Sub

    'ADD PARAMS

    Public Sub AddParam(Name As String, Value As Object)
        Dim NewParam As New SqlParameter(Name, Value)
        Params.Add(NewParam)
    End Sub

    'ERROR CHECKING
    Public Function HasException(Optional Report As Boolean = False) As Boolean
        If String.IsNullOrEmpty(Exception) Then Return False
        If Report = True Then MsgBox(Exception, MsgBoxStyle.Critical, "Exception:")
        Return True
    End Function
End Class

标签: sqlsql-servervb.netdatagridview

解决方案


SQLControl类是 VBToolbox 用户的大脑。它是一个很好的工具,一旦创建,只需简单地使用它,而不必担心通常与 SQL 数据连接相关的所有复杂设置。此外,它使解决方案更加清洁和简单。

无需修改SQLControl类,当您需要更新更改时,只需:

'SAVE UPDATES TO DATABASE
    SQL.DBDA.UpdateCommand = New SqlClient.SqlCommandBuilder(SQL.DBDA).GetUpdateCommand     'Need primary key in SEL statement
    SQL.DBDA.Update(SQL.DBDT)

然后刷新 DataGridview。


推荐阅读