【问题标题】:VB.Net Update Command Not WorkingVB.Net 更新命令不起作用
【发布时间】:2013-12-17 21:59:28
【问题描述】:

我是 VB.Net 的新手,在使用 Windows 窗体应用程序时遇到了很多麻烦。

我的表单上有一个按钮,我试图将其设置为更新我的本地 SQL Server 数据库。这是我目前在“保存”按钮后面的代码。我调整了保存按钮后面的代码,现在看起来像这样:

    Public Property InsertCommand As SqlCommand
    Public Property cn As SqlConnection     
    Private Sub b_Save_Click(sender As Object, e As EventArgs) Handles b_Save.Click
         Try

        Dim row As CV_Calls_DBDataSet.CV_Main_tblRow = DS_CV_Calls_DB.CV_Main_tbl.NewCV_Main_tblRow

        row.Call_Base_num = Me.CallNumber_mtx.Text
        row.Cash_Vendor_Code = Me.cbo_Vendor.Text
        row.Error_Code = Me.cbo_Error.Text
        row.Error_Location_Code = Me.cbo_Location.Text
        row.RowID = DS_CV_Calls_DB.CV_Main_tbl.Count + 1

        DS_CV_Calls_DB.CV_Main_tbl.AddCV_Main_tblRow(row)
        cn = New SqlConnection("Data Source=(LocalDB)\v11.0;Database=|DataDirectory|\CV_Calls_DB.mdf;Integrated Security=TRUE;")
        CreateCallAdapter(cn)
        'For Each row In DS_CV_Calls_DB.CV_Main_tbl.Rows
        '    Debug.WriteLine(row.RowState)
        '    Debug.WriteLine(row.Call_Base_num)
        '    Debug.WriteLine(row.Cash_Vendor_Code)
        '    Debug.WriteLine(row.Error_Location_Code)
        '    Debug.WriteLine(row.Error_Code)
        '    Debug.WriteLine(row.RowID)
        'Next


        TA_CV_Main.Update(DS_CV_Calls_DB.CV_Main_tbl)
        CreateCallAdapter(cn)
        MessageBox.Show(DS_CV_Calls_DB.HasChanges())
        MessageBox.Show("Saved!")
        Me.Close()
    Catch ex As Exception
        MessageBox.Show(ex.ToString)
    End Try
End Sub

    Public Function CreateCallAdapter(ByVal connection As SqlConnection) As SqlDataAdapter
    Dim adapter As SqlDataAdapter = New SqlDataAdapter
    Dim command As SqlCommand = New SqlCommand("Select * FROM CV_Main_tbl", connection)
    'Create InsertCommand
    command = New SqlCommand("INSERT INTO CV_Main_tbl (Call_Base_num, Cash_Vendor_Code, Error_Location_Code, Error_Code) VALUES (@Call_Base_num, @Cash_Vendor_Code, @Error_Location_Code, @Error_Code)", connection)
    'Add the parameters for the InsertCommand

    command.Parameters.Add("@Call_Base_num", SqlDbType.Int, Me.CallNumber_mtx.Text)
    command.Parameters.Add("@Cash_Vendor_Code", SqlDbType.SmallInt, Me.cbo_Vendor.Text)
    command.Parameters.Add("@Error_Location_Code", SqlDbType.SmallInt, Me.cbo_Location.Text)
    command.Parameters.Add("@Error_Code", SqlDbType.SmallInt, Me.cbo_Error.Text)
    command.Parameters.Add("@RowID", SqlDbType.Int, DS_CV_Calls_DB.CV_Main_tbl.Count + 1)
    adapter.InsertCommand = command
    Return adapter
End Function

当我运行此代码时,我仍然收到一条消息,说数据已保存。但是,当我通过服务器资源管理器检查实际表时,没有添加任何内容。你对我做错了什么有什么建议吗?

【问题讨论】:

  • 根据代码中使用的连接字符串验证服务器资源管理器中使用的连接字符串。它们是一样的吗?
  • 仅供参考,DataSet、DataAdapter、TableAdapter 都是老技术。您应该尝试改用实体框架。这要简单得多。

标签: .net vb.net visual-studio-2012


【解决方案1】:

DataSet.HasChanges 并不意味着更改(更改、删除或插入的行)已保存到数据库。这只是意味着这个DataSetDataTable 中至少有一行有一个RowState Unchanged

您需要将DataAdapter'Update 方法与适当的InsertCommandDeleteCommandUpdateCommands 一起使用。

所以我假设你没有提供这些Commands。您是否在表格中添加了行?然后你需要一个InsertCommand。您是否更改了DataRow 的字段,那么您需要UpdateCommand,您是否在一行或多行上调用了DataRow.Delete,那么您需要提供DeleteCommand

看看example on MSDN

在您的代码示例中,您没有将新创建的DataRow 添加到DataTable。因此,您需要使用自动生成的方法,其名称类似于:

DS_CV_Calls_DB.CV_Main_tbl.AddtblRow(row)

在您致电DataAdapter.Update之前。

【讨论】:

  • 非常感谢您提供的信息。对此,我真的非常感激。恐怕,我还是有一些麻烦。我尝试按照网站显示的方式设置我的代码,但它一直要求我提供连接字符串。我不知道如何得到它想要的。我尝试输入“Data Source=(LocalDB)\v11.0;Database=|DataDirectory|\CV_Calls_DB.mdf;Integrated Security=TRUE;”,但它告诉我无法将字符串转换为 SQL 连接。我需要做什么?
  • 好的,我让它运行了,但它仍然没有更新我的数据库。我需要做什么?
【解决方案2】:

我最近遇到了同样的问题。如果您在页面加载时设置任何输入值,那么在您“提交”页面时会再次设置这些相同的值。例如,这是我的 Page_Load 事件的简化版本:

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    displayValues()'this function sets all the input values on the page

End Sub

当我尝试提交表单并运行更新语句时,更新语句正在运行,但没有更改任何值,因为输入值首先由 displayValues() 重置。

原来这发生在 PostBack 上,所以为了解决这个问题,我添加了“IF Not IsPostBack”,这样这些值只会在初始页面加载时自动加载:

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    If Not IsPostBack Then
        displayValues()'this function sets all the input values on the page
    End If
End Sub

希望这会有所帮助!

【讨论】: