我正在为表单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
2条答案
按热度按时间rm5edbpk1#
问题似乎和我所怀疑的一样。以下是表格中的代码:
在那,你先打电话
ExeQuery
最后打电话来Update
并传递DBDT
DataTable
. 在你的ExecQuery
方法,您有:这意味着第一个代码段将调用
Update
经过一个DataTable
这是刚刚创建和填充的。你为什么会这么想DataTable
有什么变化要保存吗?这就是为什么我认为像这样的dal类是垃圾的一个例子。如果要使用这样的类,那么在创建数据适配器时,应该在其中创建一个命令生成器。
以及:
现在不用打电话了
ExecQuery
或者创建自己的命令生成器。打个电话就行了ExecQuery
一旦你需要数据,就把它填充起来DataTable
,使用它然后打电话Update
在数据适配器上传递DataTable
什么时候该省钱。也就是说,你甚至不一定需要改变这个类。如果您已经有一个示例并且已经调用了
ExecQuery
然后它已经包含数据适配器和DataTable
. 如果需要,您仍然可以创建自己的命令生成器,但不要调用ExecQuery
再次失去你已经拥有的东西。如果将第一个代码段更改为:那么它就可以工作了,假设您使用的是相同的
SQLControl
示例,就像您在第一时间获取数据一样。a1o7rhls2#
SQLControl
类是vbtoolbox用户的大脑子类。它是一个很好的工具,一旦创建,只需简单地使用它,而不必担心通常与sql数据连接相关的所有复杂设置。此外,它使解决方案更加干净和简单。不需要修改
SQLControl
类,当您需要更新更改时,只需执行以下操作:然后刷新datagridview。