C# 如何通过存储过程获取c中的返回值和行
在下面的存储过程中,如果所有条件都满足,我将返回一行,或者,我将返回一条消息,比如哪个条件不满足。 存储的进程工作正常C# 如何通过存储过程获取c中的返回值和行,c#,C#,在下面的存储过程中,如果所有条件都满足,我将返回一行,或者,我将返回一条消息,比如哪个条件不满足。 存储的进程工作正常 ALTER PROCEDURE dbo.BookingCheck ( @int_duration_of_stay int , @int_number_of_guests int, @date_of_application date, @date_of_checkin date, @date_of_che
ALTER PROCEDURE dbo.BookingCheck
(
@int_duration_of_stay int ,
@int_number_of_guests int,
@date_of_application date,
@date_of_checkin date,
@date_of_checkout date,
@str_room_type varchar(50),
@ret_value varchar(100) = '' output
)
AS
DECLARE @MaxPer int
DECLARE @BasicCharge int
DECLARE @SurCharge int
DECLARE @TotalAmount int
DECLARE @NoOfDays int
DECLARE @Free VARCHAR(10)
IF @int_duration_of_stay > 6
BEGIN
SET @NoOfDays = @int_duration_of_stay
SET @Free = 'Yes'
END
ELSE
BEGIN
SET @NoOfDays = @int_duration_of_stay - 1
SET @Free = 'No'
END
SELECT @MaxPer = int_max_pax, @BasicCharge = flt_basic_charge, @SurCharge = flt_surcharge_per_pax
FROM RoomTypes WHERE UPPER(str_room_type) = UPPER(@str_room_type)
IF DATEDIFF(DAY, GETDATE(), @date_of_checkin) < 40
BEGIN
IF @int_number_of_guests <= @MaxPer
BEGIN
SET @TotalAmount = (@NoOfDays * @int_number_of_guests * @SurCharge) + @BasicCharge
SET @ret_value = 'Success'
SELECT @str_room_type as 'Room Type', @MaxPer as 'Max Persons Allowed', @int_number_of_guests as 'No. of persons requested',
@int_duration_of_stay as 'No. of days stay', @BasicCharge as 'Basic Charge', @SurCharge as 'Sur Charge', @Free as 'Complimentary',
@TotalAmount as 'Total Amount'
END
ELSE
BEGIN
SET @ret_value = 'Max persons allowed is ' + CONVERT(VARCHAR(20), @MaxPer)
END
END
ELSE
BEGIN
SET @ret_value = 'The check in date should be less than 40 days from current date.'
END
RETURN
您需要添加一个out参数:
command.Parameters.Add("@ret_value", SqlDbType.String);
command.Parameters["@ret_value"].Direction = ParameterDirection.Output;
然后在执行SP之后
message = command.Parameters["@ret_value"].Value.ToString();
以下是不带out参数的函数:
public DataSet BookingCheck(int duration_of_stay, int number_of_guests,
string date_of_application, string date_of_checkin, string date_of_checkout,
string room_type, out string message)
{
DataSet dsGetBookingCheck = new DataSet();
SqlConnection conn = new SqlConnection(Con);
SqlCommand command = new SqlCommand("BookingCheck", conn);
command.CommandType = CommandType.StoredProcedure;
SqlDataAdapter da = new SqlDataAdapter();
SqlParameter param = new SqlParameter();
param = command.Parameters.Add("@int_duration_of_stay", SqlDbType.Int);
param.Value = duration_of_stay;
param = command.Parameters.Add("@int_number_of_guests", SqlDbType.Int);
param.Value = number_of_guests;
param = command.Parameters.Add("@date_of_application", SqlDbType.Date);
param.Value = date_of_application;
param = command.Parameters.Add("@date_of_checkin", SqlDbType.Date);
param.Value = date_of_checkin;
param = command.Parameters.Add("@date_of_checkout", SqlDbType.Date);
param.Value = date_of_checkout;
param = command.Parameters.Add("@str_room_type", SqlDbType.VarChar, 50);
param.Value = room_type;
command.Parameters.Add("@ret_value", SqlDbType.String);
command.Parameters["@ret_value"].Direction = ParameterDirection.Output;
conn.Open();
command.ExecuteNonQuery();
da.SelectCommand = command;
da.Fill(dsGetBookingCheck);
message = command.Parameters["@ret_value"].Value.ToString();
conn.Close();
return dsGetBookingCheck;
}
注意:我从未在数据适配器上使用ExecuteOnQuery然后使用Fill。这可能会把事情搞砸。这在C语言中是不可行的。您只能使用示例中的Fill方法返回一行数据表,或者使用带有返回参数的SqlCommand或ExecuteScalar返回一个值 相反,您应该在这两种情况下都执行SELECT,但根据IF语句使用不同的字段。即
SET @ret_value = 'Max persons allowed is ' + CONVERT(VARCHAR(20), @MaxPer)
转化为
SELECT 'Max persons allowed is ' + CONVERT(VARCHAR(20), @MaxPer) AS Return_Value
然后在返回数据表中检查字段名。例如
if (BookingCheck(...).Tables[0].Columns.Contains("Return_Value")) {
// Handle my special condition here
}
当您不插入任何内容时,ExecuteOnQuery在代码中做什么
有很多方法可以做到这一点。第一,使用数据阅读器。在这种情况下,它会更有帮助。或者,您可以向存储过程中添加一个输出参数,并检查在通过C执行该过程后,我是否已经返回了包含该行的数据集,如何也返回该消息?只需在SP中设置值即可,因为您已将其声明为out参数。我的意思是,如何在我的codebehind中获取返回消息?因为我只从该函数返回数据集。请向我猜的函数添加一个out参数,或者抛出一个异常,因为这是一个错误。我同意。应该做执行工作
if (BookingCheck(...).Tables[0].Columns.Contains("Return_Value")) {
// Handle my special condition here
}