Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用存储过程使用文本框中的值更新SQL Server数据库_C#_Asp.net_Sql Server_Stored Procedures - Fatal编程技术网

C# 使用存储过程使用文本框中的值更新SQL Server数据库

C# 使用存储过程使用文本框中的值更新SQL Server数据库,c#,asp.net,sql-server,stored-procedures,C#,Asp.net,Sql Server,Stored Procedures,我们有一个aspx页面,它是一个有许多文本框的页面。我们希望将输入到这些文本框中的数据用于更新SQL Server数据库。但是,如果任何文本框留空,那么我们希望数据保持原样 我们编写了以下存储过程来执行更新: ALTER PROCEDURE pr_updateBooking ( @BookingRef INT, @BoatID INT, @LeadPassenger INT, @StartDate Date, @Duration INT,

我们有一个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

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

存储过程将不接受参数值中的null,因此您可能需要进行某种检查。您确实需要在Catch{}块中放入一些代码,以查看过程是否返回错误

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


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

存储过程将不接受参数值中的null,因此您可能需要进行某种检查。您确实需要在Catch{}块中放入一些代码,以查看过程是否返回错误

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


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

应用程序中存在几个问题。
1.如注释中所述,使用
int result=cmd.ExecuteNonQuery()
(0或99)的返回值。事实上,这还不够。
2.检查表架构,查看感兴趣的字段是否允许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
。。。
作为
--声明@error INT——不需要
开始交易
开始尝试
更新BookingView
设置余额_未决=@Balance未决,评论=@Comments
其中Booking_Ref=@BookingRef
更新vBoat_预订
设置BoatID=@BoatID,Lead\u PassengerID=@leadpasser,Start\u Date=@StartDate,Duration\u In\u hours=@Duration,Number\u宠物=@pets,
儿童人数=@儿童,乘客人数=@乘客
其中Booking_Ref=@BookingRef
犯罪
结束尝试
开始捕捉
声明@ErrorMessage NVARCHAR(4000);
声明@ErrorSeverity INT;
声明@ErrorState INT;
挑选
@ErrorMessage=错误消息(),
@ErrorSeverity=错误\u严重性(),
@ErrorState=错误状态();
回降
RAISERROR(@ErrorMessage,--消息文本)。
@错误严重性,--严重性。
@错误状态——状态。
)
端接
--设置@error=@@error
--如果@error 0返回99
--否则返回0
  • 在C#中,使用catch part查看发生了什么

  • 您的应用程序中有几个问题。
    1.如注释中所述,使用
    int result=cmd.ExecuteNonQuery()
    (0或99)的返回值。事实上,这还不够。
    2.检查表架构,查看感兴趣的字段是否允许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
    
    。。。
    作为
    --声明@error INT——不需要
    开始交易
    开始尝试
    更新BookingView
    设置余额_未决=@Balance未决,评论=@Comments
    其中Booking_Ref=@BookingRef
    更新vBoat_预订
    设置BoatID=@BoatID,Lead\u PassengerID=@leadpasser,Start\u Date=@StartDate,Duration\u In\u hours=@Duration,Number\u宠物=@pets,
    儿童人数=@儿童,乘客人数=@乘客
    其中Booking_Ref=@BookingRef
    犯罪
    结束尝试
    开始捕捉
    声明@ErrorMessage NVARCHAR(4000);
    声明@ErrorSeverity INT;
    声明@ErrorState INT;
    挑选
    @ErrorMessage=错误消息(),
    @ErrorSeverity=错误\u严重性(),
    @ErrorState=错误状态();
    回降
    RAISERROR(@ErrorMessage,--消息文本)。
    @错误严重性,--严重性。
    @错误状态——状态。
    )
    端接
    --设置@error=@@error
    --如果@error 0返回99
    --否则返回0
    
  • 在C#中,使用catch part查看发生了什么

  • 使用探查器查看从页面发送到SQL Server的命令(如果有)。通过
    cmd2.ExecuteNonQuery()返回的计数是多少?同时返回0或99,您如何在C#代码中读取该值?下一步,请正确格式化您的内容/代码,以便您的帖子得到更认真的对待。我真的很抱歉,我对这一点很陌生。我不知道如何使用探查器,也不知道如何找出该方法返回的计数?请看一看,。请参阅@Guffa给出的最后一条注释您的连接字符串是什么样子的?请给我们看一下,好吗?使用探查器查看从页面发送到SQL Server的命令(如果有)。cmd2.ExecuteNonQuery()返回的计数是多少?同时返回0或99,您如何在C#代码中读取该值?下一步,请正确格式化您的内容/代码,以便您的帖子得到更认真的对待。我真的很抱歉,我对这一点很陌生。我不知道如何使用探查器,也不知道如何找出该方法返回的计数?请看一看,。请参阅@Guffa给出的最后一条注释您的连接字符串是什么样子的?请给我们看看好吗?