sql - SqlCommandBuilder 更新命令正在生成命令但不从 DataGridView 更新数据库
问题描述
我正在为 Form 2 继承一个表单类 (Form1)。Form 1 代码可以正常工作。在表格 1 中,我使用SqlCommandBuilder(SQL.DBDA).GetUpdateCommand
为我的 Datagrid 生成更新命令以传递给 SQL 数据表,该数据表再次完美运行并且表已成功更新。表格 1 更新的 SQL 命令文本如下所示:
在表格 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)
此更新命令的命令文本如下所示:
它与 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
解决方案
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。
推荐阅读
- sql - 访问搜索查询返回 PK 不值
- ruby - Windows上的Ruby on rails安装puma错误
- batch-file - 创建一个批处理文件以运行具有一些其他参数的特定 exe
- git - 即使在我进行了本地更改之后,Git 仍然说“没有什么可提交的,工作树干净”
- javascript - 如何更改背景的不透明度(这是图像?)
- javascript - 如何从 AJAX 请求中下载附件?
- python - Tkinter 窗口大小调整
- serilog - 使用 RestrictedToMinimumLevel 覆盖 Serilog 中的默认最小级别
- r - 将列添加到 df 时修复下标越界错误
- ruby-on-rails - Rails 后控制器未将用户关联传递给 React 视图