【问题标题】:changes are not commited in database but code runs and shows no error更改未在数据库中提交,但代码运行且未显示错误
【发布时间】:2021-08-23 07:56:58
【问题描述】:
    Dim con As SqlConnection = New SqlConnection("Data Source=DESKTOP-Q1UQIBI\SQLEXPRESS;Initial Catalog=Admoresystem;Integrated Security=True")
    Dim query1 As String = "UPDATE OrderSheet SET OrderName=@ordername,Aux=@aux,Description=@description,Status=@status,Auxstatus=@auxstatus,TypeDeliveryDestination=@typedeliverydestination,TrackingnNumber=@trackingnumber,TurnOverDays=@turnoverdays where OrderID=@OrderID"

    Dim cmd As SqlCommand = New SqlCommand(query1, con)
    cmd.Parameters.AddWithValue("@OrderID", Val(txtOrderID.Text.Trim.ToString))

    '  Dim date2 As String = OrderDate.Text.ToString()
    'Dim startDateTimee As String = OrderDate.Text.Trim()
    '  cmd.Parameters.AddWithValue("@orderdate", SqlDbType.DateTime).Value = OrderDate.Text

    cmd.Parameters.AddWithValue("@ordername", txtOrderName.Text.Trim.ToString)
    cmd.Parameters.AddWithValue("@aux", txtAux.Text.Trim.ToString)
    cmd.Parameters.AddWithValue("@description", txtDescription.Text.Trim.ToString)
    cmd.Parameters.AddWithValue("@status", txtStatus.Text.Trim.ToString)
    cmd.Parameters.AddWithValue("@auxstatus", txtAUXStatus.Text.Trim.ToString)
    cmd.Parameters.AddWithValue("@typedeliverydestination", TypeDeliveryDestination.Text.Trim.ToString)
    cmd.Parameters.AddWithValue("@trackingnumber", txtTrackingNumber.Text.Trim.ToString)

    ' Dim est As String = EstimatedDeliveryDate.Text.ToString()
    '  cmd.Parameters.Add("@estdeliverydate", SqlDbType.DateTime).Value = EstimatedDeliveryDate.Text

    cmd.Parameters.AddWithValue("@turnoverdays", txtTurnOverDays.Text.Trim.ToString)
    con.Open()
    cmd.ExecuteNonQuery()
    con.Close()
    con.Dispose()

    Response.Redirect("DetailPage.aspx")
    'Controlsclear()

【问题讨论】:

  • 您应该在此处发布问题之前调试您的代码。如果您已经阅读了您应该使用的类型和成员,那么您就会知道ExecuteNonQuery 返回受操作影响的记录数。如果没有抛出异常,该数字会告诉您数据是否已保存(非零)或未保存(零)。如果是,那么它就是,你错了。如果不是,那么数据库中显然没有与您的 WHERE 子句匹配的记录,因此我们无法告诉您应该是什么。
  • 您编写代码的方式表明您并没有真正考虑周全。你会得到一堆TextBoxes 中的Text,在修剪它们之后,调用ToString。在String 上调用ToString 有什么意义?它不会受到伤害,但事实上你在做一些毫无意义的事情意味着你没有考虑过你在做什么。另外,你为什么要打电话给Val 来获取ID?当然你的OrderID 不是类型Double,那么Val 有什么用呢?它会做的最好的事情是修剪非数字字符,但如果需要,你应该告诉用户,而不是忽略它们。
  • 最后——我应该带头的——只有代码的问题是不可接受的。一个问题必须是一个实际的问题,对问题有完整和清晰的解释,并且我们可以回答清楚的问题。如果需要,它应该由代码和图像支持,但它们是额外的,而不是全部。标题应该是一个摘要,而不是整个问题。
  • 除了我 100% 同意的 cmets 中提到的所有其他内容之外,您在使用 AddWithValue 时可能需要小心一点。它可以对您进行一些隐式类型转换并导致意外结果
  • 大家好,我已经编写了简单的查询来更新数据。我的前辈使用了这些更改,例如 tostring、val 和 trim。另一方面,删除查询运行并删除相同的值。

标签: vb.net webforms


【解决方案1】:

告诉你的上级坐起来注意。他的代码在 Stack Overflow 上受到了一些同行的批评。

如果代码中有错误,连接和命令将永远不会关闭和处理。 Using...End Using 块正是出于这个原因而添加的。

将用户界面代码与数据访问代码分开。他们应该是完全独立的。当你必须有多个参数传递给数据库代码时,最好创建一个类,设置参数并传递单个对象。

您需要检查数据库中参数的正确数据类型并相应地更正代码。

不要将AddWithValue 与 SQL Server 一起使用。 http://www.dbdelta.com/addwithvalue-is-evil/ 和 https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ 还有一个: https://dba.stackexchange.com/questions/195937/addwithvalue-performance-and-plan-cache-implications 这是另一个 https://andrevdm.blogspot.com/2010/12/parameterised-queriesdont-use.html

Private Function UpdateOrders(OrderToUpdate As Order) As Integer
    Dim query1 As String = "UPDATE OrderSheet SET OrderName=@ordername,Aux=@aux,Description=@description,Status=@status,Auxstatus=@auxstatus,TypeDeliveryDestination=@typedeliverydestination,TrackingnNumber=@trackingnumber,TurnOverDays=@turnoverdays where OrderID=@OrderID"
    Dim recordsUpdated As Integer
    Using con As New SqlConnection("Data Source=DESKTOP-Q1UQIBI\SQLEXPRESS;Initial Catalog=Admoresystem;Integrated Security=True"),
            cmd As SqlCommand = New SqlCommand(query1, con)
        cmd.Parameters.Add("@OrderID", SqlDbType.Int).Value = OrderToUpdate.ID
        cmd.Parameters.Add("@ordername", SqlDbType.NVarChar).Value = OrderToUpdate.Name
        cmd.Parameters.Add("@aux", SqlDbType.NVarChar).Value = OrderToUpdate.Aux
        cmd.Parameters.Add("@description", SqlDbType.NVarChar).Value = OrderToUpdate.Description
        cmd.Parameters.Add("@status", SqlDbType.NVarChar).Value = OrderToUpdate.Status
        cmd.Parameters.Add("@auxstatus", SqlDbType.NVarChar).Value = OrderToUpdate.AuxStatus
        cmd.Parameters.Add("@typedeliverydestination", SqlDbType.NVarChar).Value = OrderToUpdate.DelDestType
        cmd.Parameters.Add("@trackingnumber", SqlDbType.Int).Value = OrderToUpdate.TrackNum
        cmd.Parameters.Add("@turnoverdays", SqlDbType.Int).Value = OrderToUpdate.TurnOverDays
        con.Open()
        recordsUpdated = cmd.ExecuteNonQuery()
    End Using
    Return recordsUpdated
End Function

Public Class Order
    Public Property ID As Integer
    Public Property Name As String
    Public Property Aux As String
    Public Property Description As String
    Public Property Status As String
    Public Property AuxStatus As String
    Public Property DelDestType As String
    Public Property TrackNum As Integer
    Public Property TurnOverDays As Integer
End Class


Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim ord As New Order
    Dim id As Integer
    If Integer.TryParse(txtOrderId.Text, id) Then
        ord.ID = id
    Else
        MessageBox.Show("Please enter a valid Id")
        Exit Sub
    End If
    ord.Name = txtOrderName.Text.Trim
    ord.Aux = txtAux.Text.Trim
    ord.Description = txtDescription.Text.Trim
    ord.Status = txtStatus.Text.Trim
    ord.AuxStatus = txtAUXStatus.Text.Trim
    ord.DelDestType = TypeDeliveryDestination.Text.Trim
    Dim trackingNum As Integer
    If Integer.TryParse(txtTrackingNumber.Text.Trim, trackingNum) Then
        ord.TrackNum = trackingNum
    Else
        MessageBox.Show("Please enter a valid tracking number")
        Exit Sub
    End If
    Dim days As Integer
    If Integer.TryParse(txtTurnOverDays.Text.Trim, days) Then
        ord.TurnOverDays = days
    Else
        MessageBox.Show("Please enter valid turn over days")
        Exit Sub
    End If
    Dim RecordsUpdated As Integer
    Try
        RecordsUpdated = UpdateOrders(ord)
    Catch ex As Exception
        MessageBox.Show(ex.Message, "Update Failed")
        Exit Sub
    End Try
    MessageBox.Show($"{RecordsUpdated} record was succesfully updated.")
End Sub

看不到.ToString()。

【讨论】:

  • 我明白了。问题出在回发功能上。我没有使用回发功能,这就是它没有提交更改的原因。现在它可以正常工作了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
  • 2012-07-25
  • 2015-07-19
  • 2016-04-23
  • 2013-12-18
  • 1970-01-01
相关资源
最近更新 更多