SQL 基于文本框的服务器 Delete/Insert 无法工作。 - 对比 2010
SQL Server Delete/Insert based on textbox can't work. - VS 2010
我的 VS 2010 程序有一个 Datagridview,它从 SQL 服务器数据库加载数据,现在我正在添加几个文本框来添加新行和更新现有行。
这是按钮的子项:
Imports System.Configuration
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports System.IO
Public Class macmaster
'variables to be used'
Dim myCmd As SqlCommand 'create SQL command'
Dim myReader As SqlDataReader 'pull data'
Dim dt As New DataTable 'store data'
Dim intResult As MsgBoxResult
Dim strSQL As String
Private Sub MacSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MacSave.Click
Dim myConn = New SqlConnection("server=server;database=SQL;uid=pro;pwd=abcd") 'form connection'
Try 'alert user if any fields not filled in'
If Me.MacNm.Text.Trim = "" Then
'**this portion of code not relevant**'
Else 'proceed next step if all fields ok.'
intResult = MsgBox("Are you sure to Add/Update?", MsgBoxStyle.OkCancel)
If intResult = MsgBoxResult.Ok Then
'call connection (myConn)'
myConn.Open()
myCmd.CommandText = "DELETE FROM [SQL].[dbo].[Mac] WHERE Machine='" & MacNm.Text & "'"
myCmd.CommandText = "INSERT INTO [SQL].[dbo].[Mac](Machine, PIC, Die) VALUES('" & MacNm.Text & "','" & MacPIC.Text & "','" & MacDie.Text & "')"
MsgBox("Record Added!")
myConn.Close()
End If
End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "btnAdd_Click Exception")
End Try
End Sub
End Class
在测试过程中,我尝试了按钮。代码一直运行,直到我收到消息框说记录已添加。
但是检查 SQL 服务器数据库,我发现数据甚至没有改变。 None 的第 2 部分 SQL 查询已触发。我什至也在 SQL 服务器上测试了这两个查询。工作正常。是我引用文本框的方式有问题吗?
您缺少 ExecuteNonQuery()。
myCmd = New SqlCommand()
myCmd.Connection= myConn
mnyCmd.CommandType= CommandType.Text
Dim commands As String
commands= "DELETE FROM [SQL].[dbo].[Mac] WHERE Machine='" & MacNm.Text & "';"&"INSERT INTO [SQL].[dbo].[Mac](Machine, PIC, Die) VALUES('" & MacNm.Text & "','" & MacPIC.Text & "','" & MacDie.Text & "')"
myCmd.CommandText = commands
myCmd.ExecuteNonQuery()
MsgBox("Record Added!")
你的做法完全错了。你应该做的是:
- 通过调用
Fill
使用数据适配器填充 DataTable
。
- 将
DataTable
绑定到 BindingSource
。
- 将
BindingSource
绑定到您的 DataGridView
以及您的 TextBoxes
。
- 通过
BindingSource
添加和删除行并直接编辑行。
- 通过在数据适配器上调用
Update
并传递 DataTable
. 将所有更改一次性保存回数据库
您可以将 BindingSource
添加到设计器中的表单。数据绑定看起来像这样:
myBindingSource.DataSource = myDataTable
myDataGridView.DataSource = myBindingSource
myTextBox.DataBindings.Add("Text", myBindingSource, "Column1")
在网格中选择一行然后将使用该行的字段值填充 Textboxes
。然后,您可以在各个控件中进行编辑,并通过导航到另一行隐式提交更改,或通过在 BindingSource
上调用 EndEdit
显式提交更改。要删除所选行,请在 BindingSource
上调用 RemoveCurrent
。要添加新行,请在 BindingSource
上调用 AddNew
。我没有测试过,但我相信可以通过 TextBoxes
立即访问新行。同样,隐式或显式提交更改。如果不是很明显,BindingSource
可以处理绑定数据。
如果还不清楚,所有这些更改都是在本地进行的,仅针对 DataTable
。当您在数据适配器上调用 Update
时,数据库会更新。您将需要使用命令生成器或自己创建 InsertCommand
、UpdateCommand
和 DeleteCommand
。
我的 VS 2010 程序有一个 Datagridview,它从 SQL 服务器数据库加载数据,现在我正在添加几个文本框来添加新行和更新现有行。
这是按钮的子项:
Imports System.Configuration
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports System.IO
Public Class macmaster
'variables to be used'
Dim myCmd As SqlCommand 'create SQL command'
Dim myReader As SqlDataReader 'pull data'
Dim dt As New DataTable 'store data'
Dim intResult As MsgBoxResult
Dim strSQL As String
Private Sub MacSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MacSave.Click
Dim myConn = New SqlConnection("server=server;database=SQL;uid=pro;pwd=abcd") 'form connection'
Try 'alert user if any fields not filled in'
If Me.MacNm.Text.Trim = "" Then
'**this portion of code not relevant**'
Else 'proceed next step if all fields ok.'
intResult = MsgBox("Are you sure to Add/Update?", MsgBoxStyle.OkCancel)
If intResult = MsgBoxResult.Ok Then
'call connection (myConn)'
myConn.Open()
myCmd.CommandText = "DELETE FROM [SQL].[dbo].[Mac] WHERE Machine='" & MacNm.Text & "'"
myCmd.CommandText = "INSERT INTO [SQL].[dbo].[Mac](Machine, PIC, Die) VALUES('" & MacNm.Text & "','" & MacPIC.Text & "','" & MacDie.Text & "')"
MsgBox("Record Added!")
myConn.Close()
End If
End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "btnAdd_Click Exception")
End Try
End Sub
End Class
在测试过程中,我尝试了按钮。代码一直运行,直到我收到消息框说记录已添加。
但是检查 SQL 服务器数据库,我发现数据甚至没有改变。 None 的第 2 部分 SQL 查询已触发。我什至也在 SQL 服务器上测试了这两个查询。工作正常。是我引用文本框的方式有问题吗?
您缺少 ExecuteNonQuery()。
myCmd = New SqlCommand()
myCmd.Connection= myConn
mnyCmd.CommandType= CommandType.Text
Dim commands As String
commands= "DELETE FROM [SQL].[dbo].[Mac] WHERE Machine='" & MacNm.Text & "';"&"INSERT INTO [SQL].[dbo].[Mac](Machine, PIC, Die) VALUES('" & MacNm.Text & "','" & MacPIC.Text & "','" & MacDie.Text & "')"
myCmd.CommandText = commands
myCmd.ExecuteNonQuery()
MsgBox("Record Added!")
你的做法完全错了。你应该做的是:
- 通过调用
Fill
使用数据适配器填充DataTable
。 - 将
DataTable
绑定到BindingSource
。 - 将
BindingSource
绑定到您的DataGridView
以及您的TextBoxes
。 - 通过
BindingSource
添加和删除行并直接编辑行。 - 通过在数据适配器上调用
Update
并传递DataTable
. 将所有更改一次性保存回数据库
您可以将 BindingSource
添加到设计器中的表单。数据绑定看起来像这样:
myBindingSource.DataSource = myDataTable
myDataGridView.DataSource = myBindingSource
myTextBox.DataBindings.Add("Text", myBindingSource, "Column1")
在网格中选择一行然后将使用该行的字段值填充 Textboxes
。然后,您可以在各个控件中进行编辑,并通过导航到另一行隐式提交更改,或通过在 BindingSource
上调用 EndEdit
显式提交更改。要删除所选行,请在 BindingSource
上调用 RemoveCurrent
。要添加新行,请在 BindingSource
上调用 AddNew
。我没有测试过,但我相信可以通过 TextBoxes
立即访问新行。同样,隐式或显式提交更改。如果不是很明显,BindingSource
可以处理绑定数据。
如果还不清楚,所有这些更改都是在本地进行的,仅针对 DataTable
。当您在数据适配器上调用 Update
时,数据库会更新。您将需要使用命令生成器或自己创建 InsertCommand
、UpdateCommand
和 DeleteCommand
。