如何在c#thru存储过程中获取返回值和行

时间:2009-10-01 02:39:28

标签: 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_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

问题是不知道如何使用c#从SP获取返回消息或返回行。

如果在SP中满足条件,则下面的代码返回行。如果没有,我没有收到回复信息。怎么做到的?

 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)
{
    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;
    conn.Open();
    command.ExecuteNonQuery();
    da.SelectCommand = command;
    da.Fill(dsGetBookingCheck);
    conn.Close();
    return dsGetBookingCheck;
}

3 个答案:

答案 0 :(得分:1)

您需要添加一个输出参数:

command.Parameters.Add("@ret_value", SqlDbType.String);
command.Parameters["@ret_value"].Direction = ParameterDirection.Output;

然后执行SP

message = command.Parameters["@ret_value"].Value.ToString();

这是带有参数的函数:

 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;
}

注意:我从未使用过ExecuteNonQuery,然后在数据适配器上使用Fill。这可能搞砸了。

答案 1 :(得分:1)

当你没有插入任何东西时,ExecuteNonQuery在你的代码中做了什么?

有办法做到这一点。一,使用DataReader。在这种情况下,它会更有帮助。或者,您可以将输出参数添加到存储过程,并在通过C#执行proc后检查。

答案 2 :(得分:0)

这在C#中是行不通的。您只能使用单行返回DataTable(在示例中使用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

然后在返回的DataTable中检查字段名称。 E.g。

if (BookingCheck(...).Tables[0].Columns.Contains("Return_Value")) {
   // Handle my special condition here
}