更新存储过程不更新其中一列

Update stored procedure not updating one of the columns

如果我在 SQL 服务器中执行存储过程,一切都按预期工作,但是当我获取 Web 表单来执行它时,就会出现问题。

除了列 Estado 之外,一切似乎都在正常更新,参数 Estado(在葡萄牙语中表示 Status)是通过检查是否选中 checkbox1 获得的,如果它那么变量 Estado 将被设置为 Completado(已完成),如果没有则设置为 Pendentepending)。

然后我将参数@Estado的值赋给变量Estado的值。

下面您可以看到 Button_Click 和存储过程中的代码。

 Dim ConnStr As String = "Data Source=MARTIM-PC\SQLEXPRESS;Initial Catalog=EnotelSuporte;Integrated Security=True"
    Dim SqlCommand As New System.Data.SqlClient.SqlCommand
    SqlCommand.CommandType = Data.CommandType.StoredProcedure
    SqlCommand.CommandText = "Pedido_Update"
    SqlCommand.Parameters.Add("@PedidoId", Data.SqlDbType.NVarChar).Value = PedidoID
    SqlCommand.Parameters.Add("@Resolucao", Data.SqlDbType.NText).Value = TextBox3.Text
    SqlCommand.Parameters.Add("@Observacoes", Data.SqlDbType.NText).Value = TextBox2.Text

    If CheckBox1.Checked = True Then
        Estado = "Completado"
    ElseIf CheckBox1.Checked = False Then
        Estado = "Pendente"
    End If

    SqlCommand.Parameters.Add("@Estado", Data.SqlDbType.NVarChar).Value = Estado
    SqlCommand.Parameters.Add("@IdDepartamento", Data.SqlDbType.Int).Value = DropDownList1.SelectedValue
    SqlCommand.Parameters.Add("@IdTipoGeral", Data.SqlDbType.Int).Value = DropDownList2.SelectedValue
    SqlCommand.Parameters.Add("@IdTipoEspecifico", Data.SqlDbType.Int).Value = DropDownList3.SelectedValue
    SqlCommand.Parameters.Add("@IdHotel", Data.SqlDbType.Int).Value = DropDownList4.SelectedValue
    SqlCommand.Parameters.Add("@Descricao", Data.SqlDbType.NText).Value = TextBox1.Text

    Dim SqlConnection As New System.Data.SqlClient.SqlConnection(ConnStr)
    SqlCommand.Connection = SqlConnection

    SqlConnection.Open()
    SqlCommand.ExecuteNonQuery()
    SqlConnection.Close()

按照建议编辑代码以使用局部变量(仍然不起作用):

 Dim Estado2 As String = "Pendente"
    If CheckBox1.Checked = True Then
        Estado2 = "Completado"
    End If
    SqlCommand.Parameters.Add("@Estado", Data.SqlDbType.NVarChar).Value =    Estado2

我也试过这个以消除对变量的需要(这也不起作用,开始认为问题出在 CheckBox1 的使用上):

    If CheckBox1.Checked Then
        SqlCommand.Parameters.Add("@Estado", Data.SqlDbType.NVarChar).Value = "Completado"
    ElseIf CheckBox1.Checked = False Then
        SqlCommand.Parameters.Add("@Estado", Data.SqlDbType.NVarChar).Value = "Pendente"
    End If

这是存储过程:

ALTER PROCEDURE [dbo].[Pedido_Update]  
    @PedidoId int,
    @Observacoes ntext,
    @IdDepartamento int,
    @IdHotel int,
    @IdTipoEspecifico int,
    @IdTipoGeral int,
    @Resolucao ntext,
    @Descricao ntext,
    @Estado nvarchar(50)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    UPDATE Pedidos 
    SET Resolucao = @Resolucao,
        Observacoes = @Observacoes,
        IdDepartamento = @IdDepartamento, 
        IdHotel = @IdHotel, 
        IdTipoEspecifico = @IdTipoEspecifico,
        IdTipoGeral = @IdTipoGeral,
        PedidoDescricao = @Descricao,
        Estado = @Estado
    WHERE 
        IdPedido = @PedidoId
END

刚刚注意到一些有趣的事情。当 URL 中没有 QueryString 时,CheckBox1.Checked 的值是 True(示例:http://localhost:50851/Gestor/Pedidos/PedidoVisualizar.aspx)。当有 QueryStrings 时(例如:http://localhost:50851/Gestor/Pedidos/PedidoVisualizar.aspx?PedidoId=4CheckBox1.Checked 设置为 False 独立于是否检查它。

代码似乎没问题。但是,如果我正确地理解您正在使用 "global" 变量来存储 Estado,并且它取决于网络表单中的控件,那么您应该考虑不同会话中的此表单可能会在之前更改 Estado 中的值的可能性在 SQL 上保存数据后。

换句话说,您不能相信您获得的值是您的网络表单设置的值,因为您正在为所有打开的会话共享此变量。

如果不是这种情况,您可能需要提供更多信息和一些来自您的 asp.net 应用程序的代码 希望有所帮助