C# 使用存储过程使用文本框中的值更新SQL Server数据库
我们有一个aspx页面,它是一个有许多文本框的页面。我们希望将输入到这些文本框中的数据用于更新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,
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
您的应用程序中有几个问题。
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
使用探查器查看从页面发送到SQL Server的命令(如果有)。通过
cmd2.ExecuteNonQuery()返回的计数是多少代码>?同时返回0或99,您如何在C#代码中读取该值?下一步,请正确格式化您的内容/代码,以便您的帖子得到更认真的对待。我真的很抱歉,我对这一点很陌生。我不知道如何使用探查器,也不知道如何找出该方法返回的计数?请看一看,。请参阅@Guffa给出的最后一条注释您的连接字符串是什么样子的?请给我们看一下,好吗?使用探查器查看从页面发送到SQL Server的命令(如果有)。cmd2.ExecuteNonQuery()返回的计数是多少代码>?同时返回0或99,您如何在C#代码中读取该值?下一步,请正确格式化您的内容/代码,以便您的帖子得到更认真的对待。我真的很抱歉,我对这一点很陌生。我不知道如何使用探查器,也不知道如何找出该方法返回的计数?请看一看,。请参阅@Guffa给出的最后一条注释您的连接字符串是什么样子的?请给我们看看好吗?