我有这个酒店预订系统,有一个下拉列表,用户可以选择要预订的特定房型的房间数。这是我的Table_Room,我将在Table_MyCart上插入房间ID
Room_ID | Room_Type | Username | Arrival_Date | Departure_Date | Status
--------|-----------|----------|--------------|----------------|-------
CI-1 |Carneros |myuser |date |date |Available
CI-2 |Carneros |myuser |date |date |Available
我当前的代码只获得第一个Room_ID,即(CI-1),但如果用户使用下拉列表并为当前类型选择了2个房间,该怎么办?我如何获得Room_ID(CI-2)?这是我目前的代码:
roomtype = "Carneros Inn";
SqlCommand cmd = new SqlCommand("FindRoom", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@ROOM_TYPE", SqlDbType.VarChar).Value = roomtype;
conn.Open();
cmd.ExecuteNonQuery();
roomid = cmd.ExecuteScalar().ToString();
conn.Close();
FindRoom StoredProcedure的我的SQL代码是这样的:
CREATE PROCEDURE [dbo].[FindRoom]
@ROOM_TYPE VARCHAR (20)
AS
SELECT ROOM_ID FROM TBL_Room
WHERE ROOM_TYPE = @ROOM_TYPE AND STATUS = 'AVAILABLE';
任何帮助将不胜感激
答案 0 :(得分:2)
您的存储过程已经返回选择了RoomType状态可用的所有行。
相反,您的C#代码使用ExecuteScalar,它只能返回存储过程返回的第一行的第一列。
如果你想阅读所有可用的room_id,一种方法可能是使用ExecuteReader并循环返回的行
int room_qty = 2; // <-- this comes from user input
List<string> rooms = new List<string>();
roomtype = "Carneros Inn";
SqlCommand cmd = new SqlCommand("FindRoom", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@ROOM_TYPE", SqlDbType.VarChar).Value = roomtype;
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
while(reader.Read())
{
rooms.Add(reader["room_id"].ToString());
Console.WriteLine("Selected room ID = " + roomID);
// We have reached the requested quantity????
if(rooms.Count == room_qty)
break;
}
conn.Close();
if(rooms.Count < room_qty)
Console.WriteLine("Not enough room available!");
现在请求的所有room_id都存储在List<string>
中,您可以使用它进行进一步处理。
例如(根据您在下面的评论)
foreach(string roomid in rooms)
cs.SaveCart(roomid, roomtype, qty, guest, arrival, departure, price1);