sqlcommandbuilder update命令正在生成命令,但没有从datagridview更新数据库

ax6ht2ek  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(450)

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

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

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

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

它与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

如果有人对我需要做什么才能使update命令正常工作有任何想法/解决方案,我将不胜感激。谢谢!
根据以下请求添加了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
rm5edbpk

rm5edbpk1#

问题似乎和我所怀疑的一样。以下是表格中的代码:

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

在那,你先打电话 ExeQuery 最后打电话来 Update 并传递
DBDT DataTable . 在你的 ExecQuery 方法,您有:

DBDT = New DataTable
DBDA = New SqlDataAdapter(DBCmd)
RecordCount = DBDA.Fill(DBDT)

这意味着第一个代码段将调用 Update 经过一个 DataTable 这是刚刚创建和填充的。你为什么会这么想 DataTable 有什么变化要保存吗?这就是为什么我认为像这样的dal类是垃圾的一个例子。
如果要使用这样的类,那么在创建数据适配器时,应该在其中创建一个命令生成器。

'DB DATA
Public DBDA As SqlDataAdapter
Public DBCB As SqlCommandBuilder
Public DBDT As DataTable

以及:

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

现在不用打电话了 ExecQuery 或者创建自己的命令生成器。打个电话就行了 ExecQuery 一旦你需要数据,就把它填充起来 DataTable ,使用它然后打电话 Update 在数据适配器上传递 DataTable 什么时候该省钱。
也就是说,你甚至不一定需要改变这个类。如果您已经有一个示例并且已经调用了 ExecQuery 然后它已经包含数据适配器和 DataTable . 如果需要,您仍然可以创建自己的命令生成器,但不要调用 ExecQuery 再次失去你已经拥有的东西。如果将第一个代码段更改为:

Dim commandBuilder As New SqlClient.SqlCommandBuilder(SQL.DBDA)

SQL.DBDA.Update(SQL.DBDT)

那么它就可以工作了,假设您使用的是相同的 SQLControl 示例,就像您在第一时间获取数据一样。

a1o7rhls

a1o7rhls2#

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。

相关问题