Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.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# 如何通过存储过程获取c中的返回值和行_C# - Fatal编程技术网

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
}