2009-10-01 30 views
0

在下面的存储过程中,如果所有条件都满足,我将返回一行,否则我将返回一条消息,如条件是否满足。 存储的过程是可以正常使用...如何在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; 
} 

回答

1

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

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

注:执行SP

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

这里是出PARAM功能后

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

则:我从来没有使用过ExecuteNonQu然后使用填充数据适配器。这可能会搞砸了。

+0

@tster,我已经返回一个包含该行的数据集,如何返回消息呢? – Anuya 2009-10-01 02:54:17

+0

只需在SP中设置值就可以做到这一点,因为您已将其声明为输出参数。 – tster 2009-10-01 02:58:44

+0

我的意思是,如何在我的代码隐藏中获取返回消息?因为我只返回该函数的数据集。 – Anuya 2009-10-01 03:00:55

0

这在C#中无法实现。您只能使用单行返回一个DataTable(在您的示例中使用Fill方法),或者可以返回单个值(使用带有返回参数或ExecuteScalar的SqlCommand)。

相反,你应该在两种情况下做一个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 
} 
1

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

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

+0

我同意。应该做ExecuteQuery() – tster 2009-10-01 03:14:51