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!")

你的做法完全错了。你应该做的是:

  1. 通过调用 Fill 使用数据适配器填充 DataTable
  2. DataTable 绑定到 BindingSource
  3. BindingSource 绑定到您的 DataGridView 以及您的 TextBoxes
  4. 通过 BindingSource 添加和删除行并直接编辑行。
  5. 通过在数据适配器上调用 Update 并传递 DataTable.
  6. 将所有更改一次性保存回数据库

您可以将 BindingSource 添加到设计器中的表单。数据绑定看起来像这样:

myBindingSource.DataSource = myDataTable
myDataGridView.DataSource = myBindingSource
myTextBox.DataBindings.Add("Text", myBindingSource, "Column1")

在网格中选择一行然后将使用该行的字段值填充 Textboxes。然后,您可以在各个控件中进行编辑,并通过导航到另一行隐式提交更改,或通过在 BindingSource 上调用 EndEdit 显式提交更改。要删除所选行,请在 BindingSource 上调用 RemoveCurrent。要添加新行,请在 BindingSource 上调用 AddNew。我没有测试过,但我相信可以通过 TextBoxes 立即访问新行。同样,隐式或显式提交更改。如果不是很明显,BindingSource 可以处理绑定数据。

如果还不清楚,所有这些更改都是在本地进行的,仅针对 DataTable。当您在数据适配器上调用 Update 时,数据库会更新。您将需要使用命令生成器或自己创建 InsertCommandUpdateCommandDeleteCommand