Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.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#_Sql_Asp.net - Fatal编程技术网

C# 从不同行获取单元格值(行数取决于用户输入)

C# 从不同行获取单元格值(行数取决于用户输入),c#,sql,asp.net,C#,Sql,Asp.net,我有这个酒店预订系统,有一个下拉列表,用户可以根据特定的房间类型选择要预订的房间数量。这是我的Table_Room,我将在这里获取要插入Table_MyCart的房间ID Room_ID | Room_Type | Username | Arrival_Date | Departure_Date | Status --------|-----------|----------|--------------|----------------|------- CI-1 |Carneros

我有这个酒店预订系统,有一个下拉列表,用户可以根据特定的房间类型选择要预订的房间数量。这是我的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
我的当前代码只获取第一个房间ID,即(CI-1),但是如果用户使用dropdownlist并为当前类型选择了2个房间,该怎么办?我如何获得房间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 StoredProcess的Sql代码如下:

CREATE PROCEDURE [dbo].[FindRoom]
@ROOM_TYPE VARCHAR (20)
AS
SELECT ROOM_ID FROM TBL_Room 
WHERE ROOM_TYPE = @ROOM_TYPE AND STATUS = 'AVAILABLE';

任何帮助都将不胜感激

您的存储过程已经返回了RoomType choosen状态为可用的所有行。
相反,C#代码使用ExecuteScalar,它只能返回存储过程返回的第一行的第一列

如果要读取所有可用的房间id,一种方法是使用并循环返回的行

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!");

您从
cmd
读取的结果不正确。您不希望得到标量结果。相反,您需要一个行集。看一看@。让我了解一下,用户可以选择一个房间,选择房间ID?@Steve用户将选择要预订的房间数量,系统将自动为他们提供房间ID,告诉他们要预订的房间数量。您当前的代码只返回一项,因为您使用的是“cmd.ExecuteScalar()”。。使用'cmd.Execute(),它返回一个将获得所有结果的读取器。很抱歉问这个问题,但这将是我第一次使用'List rooms=new List();'我如何获取代码中存储的所有值并将其传输到我的TBL_MyCart?我当前用于在TBL_MyCart上传输数据的代码是“cs.SaveCart(roomid、roomtype、qty、guest、arrival、example、price1);”您需要一个循环,并使用rooms[0]、rooms[1]等为存储在rooms中的每个元素调用该代码(替换您的roomid)。非常感谢,它成功了!我非常感激
foreach(string roomid in rooms)
   cs.SaveCart(roomid, roomtype, qty, guest, arrival, departure, price1);