【问题标题】:Updating SQL database Issue [closed]更新 SQL 数据库问题 [关闭]
【发布时间】:2018-09-06 12:56:02
【问题描述】:

非常感谢您的回复。所以我已经做出了你建议的更改,但我仍然没有让我的数据库更新。我对您的代码所做的唯一更改是 MessageBox 行。我将它们更改为警报消息。我在这里想念什么?也许我的变量需要以不同的方式声明谢谢!!!

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click


    Dim x As Integer
    Dim z As Integer
    Dim r As Integer

    Dim V1 As String
    Dim V2 As String




    x = txbPalletNumber.Text
    z = txbOrderNumber.Text
    r = txbShipmentNumber.Text


    Try
            Using conn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\inetpub\wwwroot\Traceability\Traceability.accdb")
                If Not Integer.TryParse(txbPalletNumber.Text, x) Then
                Response.Write("<script type=""text/javascript"">alert(""Pallet Number must be a Number"");</script")
                Exit Sub
                End If
                If Not Integer.TryParse(txbOrderNumber.Text, z) Then
                Response.Write("<script type=""text/javascript"">alert(""Order Number must be a Number"");</script")
                Exit Sub
                End If
                If Not Integer.TryParse(txbShipmentNumber.Text, r) Then
                Response.Write("<script type=""text/javascript"">alert(""Shipment Number must be a Number"");</script")
                Exit Sub
                End If
                Using cmd As New OleDbCommand("SELECT Status FROM tblPalletRecords WHERE Palletnumber = @x ", conn)
                    cmd.Parameters.Add("@x", OleDbType.Integer).Value = x
                    conn.Open()
                    V1 = CStr(cmd.ExecuteScalar())
                conn.Close()

            End Using
                If V1 = "In Stock" Then
                    Using cmd2 As New OleDbCommand("UPDATE tblPalletRecords SET OrderNumber = @z, ShipmentNumber = @r WHERE PalletNumber = @x", conn)
                        cmd2.CommandText = "UPDATE tblPalletRecords SET OrderNumber = @z, ShipmentNumber = @r WHERE PalletNumber = @x "
                        cmd2.Parameters.Add("@z", OleDbType.Integer).Value = z
                        cmd2.Parameters.Add("@r", OleDbType.Integer).Value = r
                        cmd2.Parameters.Add("@x", OleDbType.Integer).Value = x
                        conn.Open()
                        cmd2.ExecuteNonQuery()
                        conn.Close()
                    End Using
                    Using cmd3 As New OleDbCommand("SELECT Status FROM tblPalletRecords WHERE Palletnumber = @x", conn)
                        cmd3.Parameters.Add("@x", OleDbType.Integer).Value = x
                        conn.Open()
                        V2 = CStr(cmd3.ExecuteScalar())
                        conn.Close()
                    End Using
                    Response.Write("<script type=""text/javascript"">alert(""The Status to " & x & " has Changed to " & V2 & """);</script")
                Else
                    Response.Write("<script type=""text/javascript"">alert(""The Pallet is not In Stock to Ship"");</script")
                End If
            End Using
        Catch ex As Exception
            'Error handling
        End Try

        txbSearch.Text = txbPalletNumber.Text
    GridView1.DataBind()
End Sub
End Class

【问题讨论】:

  • 具体说明什么不起作用。
  • 我的更新语句没有更新数据库。@brien
  • 除了我看到警告消息“x 的状态已更改为 V2”,因此它必须运行更新 SQL。但由于某种原因,它没有更新。@brien

标签: sql asp.net vb.net ms-access


【解决方案1】:

在执行更新语句之前,您使用 select 语句覆盖命令文本的值,因此它永远不会运行。

【讨论】:

  • 谢谢!!!好的,我该如何解决这个问题?@Kyle Burns
【解决方案2】:

你可以声明新的oledbcommand,因为最后一个命令覆盖更新命令:

Dim cmd2 as New OleDbCommand 'Set the command properties. cmd.Connection = conn cmd.CommandText = "SELECT Status FROM tblPalletRecords WHERE Palletnumber = " & x & " " V1 = cmd.ExecuteScalar() If V1 = "In Stock" Then cmd2.CommandText = "UPDATE tblPalletRecords SET OrderNumber = " & z & ", ShipmentNumber = " & r & " WHERE PalletNumber = " & x & " " cmd.CommandText = "SELECT Status FROM tblPalletRecords WHERE Palletnumber = " & x & " " V2 = cmd.ExecuteScalar() Response.Write("<script type=""text/javascript"">alert(""The Status to " & x & " has Changed to " & V2 & """);</script") Else Response.Write("<script type=""text/javascript"">alert(""The Pallet is not In Stock to Ship"");</script") End If cmd2.ExecuteNonQuery() conn.Close()

【讨论】:

    【解决方案3】:

    现在为您的所有项目启用 Option Strict。在您执行之前直接打开您的连接并在之后立即关闭它。使用 TryParse 检查您是否有正确的数字输入。始终使用参数。它将减少灾难性的 SQL 注入并使您的 SQL 语句更易于编写。我添加了 Using..End Using 语句。这将负责处理您的对象。如果在到达 .Close() 方法之前发生错误,它也会关闭您的连接。我本来希望重用 x 参数,但 Access 不关心参数名称,只关心 SQL 语句中的顺序,所以我每次都使用一个新命令。我已经展示了如何使用构造函数来节省几行代码;在连接构造函数中传递连接字符串,并将 CommandText 和 Connection 直接传递给 Command 构造函数。从您的 SQL 语句中可以看出,x、z 和 r 都是数字类型而不是字符串,所以我猜是整数。您可能需要更改此设置,具体取决于表中的数据类型。

    Dim x As Integer
            Dim z As Integer
            Dim r As Integer
            Dim V1 As String
            Dim V2 As String
            Try
                Using conn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\inetpub\wwwroot\Traceability\Traceability.accdb")
                    If Not Integer.TryParse(txbPalletNumber.Text, x) Then
                        MessageBox.Show("Please enter a number for the Pallet.")
                        Exit Sub
                    End If
                    If Not Integer.TryParse(txbOrderNumber.Text, z) Then
                        MessageBox.Show("Please enter a number for the Order Number.")
                        Exit Sub
                    End If
                    If Not Integer.TryParse(txbShipmentNumber.Text, r) Then
                        MessageBox.Show("Please enter a number for the Shipment Number.")
                        Exit Sub
                    End If
                    Using cmd As New OleDbCommand("SELECT Status FROM tblPalletRecords WHERE Palletnumber = @x ", conn)
                        cmd.Parameters.Add("@x", OleDbType.Integer).Value = x
                        conn.Open()
                        V1 = CStr(cmd.ExecuteScalar())
                        conn.Close()
                    End Using
                    If V1 = "In Stock" Then
                        Using cmd2 As New OleDbCommand("UPDATE tblPalletRecords SET OrderNumber = @z, ShipmentNumber = @r WHERE PalletNumber = @x", conn)
                            cmd2.CommandText = "UPDATE tblPalletRecords SET OrderNumber = @z, ShipmentNumber = @r WHERE PalletNumber = @x "
                            cmd2.Parameters.Add("@z", OleDbType.Integer).Value = z
                            cmd2.Parameters.Add("@r", OleDbType.Integer).Value = r
                            cmd2.Parameters.Add("@x", OleDbType.Integer).Value = x
                            conn.Open()
                            cmd2.ExecuteNonQuery()
                            conn.Close()
                        End Using
                        Using cmd3 As New OleDbCommand("SELECT Status FROM tblPalletRecords WHERE Palletnumber = @x", conn)
                            cmd3.Parameters.Add("@x", OleDbType.Integer).Value = x
                            conn.Open()
                            V2 = CStr(cmd3.ExecuteScalar())
                            conn.Close()
                        End Using
                        Response.Write("<script type=""text/javascript"">alert(""The Status to " & x & " has Changed to " & V2 & """);</script")
                    Else
                        Response.Write("<script type=""text/javascript"">alert(""The Pallet is not In Stock to Ship"");</script")
                    End If
                End Using
            Catch ex As Exception
                'Error handling
            End Try
    

    【讨论】:

    • 你能看看我原来的帖子吗?我已经进行了所有更改,但仍然无法正常工作。 @玛丽
    • 好吧,我在我拥有的 Access db 上尝试了类似的操作,并且成功了。有时数据文件被复制到本地目录并且它正在更新错误的文件。将 cmd2.ExecuteNonQuery() 行更改为 Dim RowsAffected as Integer = cmd2.ExecuteNonQuery() 然后显示 RowsAffected。我会做 Debug.Print(RowsAffected.ToString) 你可能必须导入 System.Diagnostics。 RowsAffected 应该是 1。
    • 感谢这位玛丽,我实际上以不同的方式工作,现在我遇到了这个问题。 forums.asp.net/p/2138477/…@Mary
    • 我检查了链接,但没有发现任何问题。我会尝试指定 OlecbType 的 .Add 方法。如果我的回答对您原来的问题有帮助,请在答案左侧打勾接受我的回答,
    【解决方案4】:

    你需要先学习编码标准,声明x,y,z之类的变量,我很久没见过了。

    您正在覆盖 cmd.CommandText

    cmd.CommandText = "UPDATE tblPalletRecords SET OrderNumber = " & z & ", ShipmentNumber = " & r & " WHERE PalletNumber = " & x & " "
                cmd.CommandText = "SELECT Status FROM tblPalletRecords WHERE Palletnumber = " & x & " "
                V2 = cmd.ExecuteScalar()
    

    修复:

     cmd.CommandText = "UPDATE tblPalletRecords SET OrderNumber = " & z & ", ShipmentNumber = " & r & " WHERE PalletNumber = " & x & " "
    cmd.ExecuteNonQuery()
    

    【讨论】:

    • 使用参数会更好地帮助阻止sql注入。
    • 真的!这就是我在第一行糟糕的编码标准中提到的! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 2022-11-16
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多