更新存储过程不更新其中一列
Update stored procedure not updating one of the columns
如果我在 SQL 服务器中执行存储过程,一切都按预期工作,但是当我获取 Web 表单来执行它时,就会出现问题。
除了列 Estado
之外,一切似乎都在正常更新,参数 Estado
(在葡萄牙语中表示 Status
)是通过检查是否选中 checkbox1 获得的,如果它那么变量 Estado
将被设置为 Completado
(已完成),如果没有则设置为 Pendente
(pending
)。
然后我将参数@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=4
) CheckBox1.Checked
设置为 False
独立于是否检查它。
代码似乎没问题。但是,如果我正确地理解您正在使用 "global" 变量来存储 Estado,并且它取决于网络表单中的控件,那么您应该考虑不同会话中的此表单可能会在之前更改 Estado 中的值的可能性在 SQL 上保存数据后。
换句话说,您不能相信您获得的值是您的网络表单设置的值,因为您正在为所有打开的会话共享此变量。
如果不是这种情况,您可能需要提供更多信息和一些来自您的 asp.net 应用程序的代码
希望有所帮助
如果我在 SQL 服务器中执行存储过程,一切都按预期工作,但是当我获取 Web 表单来执行它时,就会出现问题。
除了列 Estado
之外,一切似乎都在正常更新,参数 Estado
(在葡萄牙语中表示 Status
)是通过检查是否选中 checkbox1 获得的,如果它那么变量 Estado
将被设置为 Completado
(已完成),如果没有则设置为 Pendente
(pending
)。
然后我将参数@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=4
) CheckBox1.Checked
设置为 False
独立于是否检查它。
代码似乎没问题。但是,如果我正确地理解您正在使用 "global" 变量来存储 Estado,并且它取决于网络表单中的控件,那么您应该考虑不同会话中的此表单可能会在之前更改 Estado 中的值的可能性在 SQL 上保存数据后。
换句话说,您不能相信您获得的值是您的网络表单设置的值,因为您正在为所有打开的会话共享此变量。
如果不是这种情况,您可能需要提供更多信息和一些来自您的 asp.net 应用程序的代码 希望有所帮助