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

时间:2015-01-30 15:56:47

标签: asp.net sql-server vb.net stored-procedures query-string

如果我在SQL Server中执行存储过程,一切都按预期工作,但是当我得到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中没有QueryStrings时,CheckBox1.Checked的值为True(例如:http://localhost:50851/Gestor/Pedidos/PedidoVisualizar.aspx)。当QueryStrings(示例:http://localhost:50851/Gestor/Pedidos/PedidoVisualizar.aspx?PedidoId=4CheckBox1.Checked设置为False时,无论是否选中它。

1 个答案:

答案 0 :(得分:0)

代码似乎没问题。但是,如果我理解你正在使用“全局”变量来存储Estado,并且它依赖于webform中的控件,那么您应该考虑这个表单在不同会话中可能会在保存之后更改Estado中的值你的SQL数据。

换句话说,当您为所有打开的会话共享此变量时,您无法相信您获得的值是您的网络表单设置的值。

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