【问题标题】:Updating SQL Server database with values from textboxes using stored procedure使用存储过程使用文本框中的值更新 SQL Server 数据库
【发布时间】:2016-05-11 14:17:56
【问题描述】:

我们有一个包含多个文本框的 aspx 页面。我们希望将输入到这些文本框中的数据用它们更新我们的 SQL Server 数据库。但是,如果任何文本框留空,那么我们希望数据保持原样。

我们编写了以下存储过程来执行更新:

ALTER PROCEDURE pr_updateBooking
(
    @BookingRef INT, 
    @BoatID INT, 
    @LeadPassenger INT, 
    @StartDate Date, 
    @Duration INT, 
    @Pets INT, 
    @Children INT, 
    @Passengers INT, 
    @SpecialRequests VARCHAR(255), 
    @BalanceOutstanding NUMERIC(12, 2), 
    @Comments VARCHAR(50)
)
AS
    DECLARE @error INT

    UPDATE BookingView
    SET Balance_Outstanding = @BalanceOutstanding, 
        Comments = @Comments 
    WHERE Booking_Ref = @BookingRef

    UPDATE vBoat_Booking 
    SET BoatID = @BoatID, Lead_PassengerID = @LeadPassenger, 
        Start_Date = @StartDate, Duration_In_hours = @Duration,  
        Number_of_pets = @Pets, Number_of_children = @Children, 
        Number_of_passengers = @Passengers
    WHERE Booking_Ref = @BookingRef

    SET @error = @@error

    IF @error <> 0 
       RETURN 99
    ELSE 
       RETURN 0

这是在我们的 aspx 页面上单击提交按钮时将运行的 C# 代码

protected void buttonClicked(object sender, EventArgs e)
{
    string CS = ConfigurationManager.ConnectionStrings["G4StowawaysConnectionString"].ConnectionString;

    SqlConnection conn = new SqlConnection(CS);
    conn.Open();

    SqlCommand cmd2 = new SqlCommand("pr_updateBooking", conn);
    cmd2.CommandType = CommandType.StoredProcedure;

    // add our parameters to our command object  
    cmd2.Parameters.Add("@BookingRef", SqlDbType.Int).Value = BookingRef.Text;
    cmd2.Parameters.Add("@BoatID", SqlDbType.Int).Value = BoatID.Text;
    cmd2.Parameters.Add("@LeadPassenger", SqlDbType.Int).Value = LeadPassenger.Text;
    cmd2.Parameters.Add("@StartDate", SqlDbType.Date).Value = StartDate.Text;
    cmd2.Parameters.Add("@Duration", SqlDbType.Money).Value = Duration.Text;
    cmd2.Parameters.Add("@Pets", SqlDbType.Int).Value = Pets.Text;
    cmd2.Parameters.Add("@Children", SqlDbType.Int).Value = Children.Text;
    cmd2.Parameters.Add("@Passengers", SqlDbType.Int).Value = Passengers.Text;
    cmd2.Parameters.Add("@SpecialRequests", SqlDbType.VarChar, 255).Value = SpecialRequests.Text;
    cmd2.Parameters.Add("@BalanceOutstanding", SqlDbType.Int).Value = BalanceOutstanding.Text;
    cmd2.Parameters.Add("@Comments", SqlDbType.VarChar, 50).Value = Comments.Text;

    try
    {
        if (cmd2.Connection.State == ConnectionState.Closed)
        {
            cmd2.Connection.Open();
        }
        cmd2.ExecuteNonQuery();
    }
    catch (Exception)
    {
    }
    finally
    {                
        cmd2.Connection.Close();
    }
}

当我们运行页面时没有错误消息但是数据没有出现在数据库中!?

【问题讨论】:

  • 使用分析器查看从页面发送到 SQL Server 的命令(如果有)。
  • cmd2.ExecuteNonQuery(); 返回的计数是多少?您还返回 0 或 99,您如何在 C# 代码中读取它?今后请正确格式化您的内容/代码,以便您的帖子得到更认真的对待。
  • 我真的很抱歉我对此很陌生。我不知道如何使用分析器,也不知道如何找出该方法返回的计数?
  • 请看。,见@Guffastackoverflow.com/questions/767574/…最后的评论
  • 你的连接字符串是什么样的?请给我们看看好吗?

标签: c# asp.net sql-server stored-procedures


【解决方案1】:

您的应用程序存在多个问题。
1. 如 cmets 中所述,使用来自int result = cmd.ExecuteNonQuery()(0 或 99)的返回值。事实上,这还不够。
2. 检查您的表模式以查看是否感兴趣的字段allow null。
3. 在你的存储过程中使用事务。

...
AS
--DECLARE @error INT --no need
begin transaction
begin try
UPDATE BookingView
SET Balance_Outstanding = @BalanceOutstanding, Comments = @Comments 
WHERE Booking_Ref = @BookingRef

UPDATE vBoat_Booking 
SET BoatID = @BoatID, Lead_PassengerID = @LeadPassenger, Start_Date =     @StartDate, Duration_In_hours = @Duration, Number_of_pets = @Pets,
    Number_of_children = @Children, Number_of_passengers = @Passengers
WHERE Booking_Ref = @BookingRef

commit
end try
begin catch
    DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;

SELECT 
    @ErrorMessage = ERROR_MESSAGE(),
    @ErrorSeverity = ERROR_SEVERITY(),
    @ErrorState = ERROR_STATE();

rollback

RAISERROR (@ErrorMessage, -- Message text.
           @ErrorSeverity, -- Severity.
           @ErrorState -- State.
           )
end catch


--SET @error = @@error

--IF @error <> 0 RETURN 99
--ELSE RETURN 0
  1. 在 C# 中使用 catch 部分查看发生了什么。

【讨论】:

    【解决方案2】:

    存储过程将不接受参数值中的空值,因此您需要进行一些检查 - 也许。您确实需要在 Catch {} 块中放置一些代码,以查看该过程是否返回错误。

    我不知道你想在哪里阻止更新。如前所述,该问题应该在 UI 中解决。如果任何条目为空,则不允许提交。很简单。

    如果您希望该过程避免执行更新,那么您应该将所有参数设置为允许空值。然后在允许更新之前检查任何空值。您可以抛出用户定义的错误或 99(按设计)。这种方法还要求您仅在文本框不为空时设置参数值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      • 2023-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多