C# 从SQL查询返回多个变量

C# 从SQL查询返回多个变量,c#,sql,database,tsql,variables,C#,Sql,Database,Tsql,Variables,我的表格结构如下: Session -------------- SessionID (PK) RoomID SessionDate SessionTimeStart SessionTimeEnd 我有一个查询,它将始终返回一行并显示在DGV中。我使用DataAdapter进行连接: DataTable queryResult = new DataTable(); string ConnStr = "Data Source=DUZY;Initial C

我的表格结构如下:

Session
--------------
SessionID (PK)
RoomID     
SessionDate
SessionTimeStart
SessionTimeEnd
我有一个查询,它将始终返回一行并显示在DGV中。我使用DataAdapter进行连接:

        DataTable queryResult = new DataTable();
        string ConnStr = "Data Source=DUZY;Initial Catalog=AutoRegSQL;Integrated Security=True";

        SqlConnection MyConn = new SqlConnection(ConnStr);
        MyConn.Open();

        //SQL query that returns todays sessions for the given roomID
        string query = @"SELECT SessionID, RoomID, SessionDate, SessionTimeStart, SessionTimeEnd" +
           " FROM [Session] " +
           " WHERE RoomID = @RoomID " +
           " AND SessionDate = cast(getdate() as date) ";

        SqlCommand command = new SqlCommand(query, MyConn);

        command.Parameters.Add("RoomID", SqlDbType.Char).Value = RoomID;


        SqlDataAdapter adapter = new SqlDataAdapter(command);

        adapter.Fill(queryResult);
我想将查询结果保存到表示表列的多个字符串中,即

SessionIDstring = query result for SessionID column
RoomIDstring = query result for RoomID column
and so on...

是否可以使用一个查询来实现它,或者我必须为每列创建5个查询?

使用ADO.NET实现类似的功能

declare @col1 int
declare @col2 varchar(42)

select  @col1 = col1
,       @col2 = col2
,       ....
    //SQL query that returns todays sessions for the given roomID
string query = @"SELECT SessionID, RoomID, SessionDate, SessionTimeStart, SessionTimeEnd" +
                " FROM [Session] " +
                " WHERE RoomID = @RoomID " +
                " AND SessionDate = cast(getdate() as date) ";

using (var connection = new SqlConnection(ConnStr))
using (var command = new SqlCommand(query, connection))
{
    command.Parameters.Add("RoomID", SqlDbType.Char).Value = RoomID;

    try
    {
        connection.Open();

        using (SqlDataReader reader = command.ExecuteReader())
        {
            if (reader.Read())
            {
                // Note that reader[x] has the equivalent type to the type
                // of the returned column, converted using
                // http://msdn.microsoft.com/en-us/library/cc716729.aspx
                // .ToString() if the item isn't null is always ok
                string SessionIDstring = reader[0].ToString(); // it should be an int

                // reading it twice is ok
                int RoomID = (int)reader[1]; // it should be an int
                string RoomIDstring = reader[1].ToString(); // it should be an int

                if (reader.Read())
                {
                    throw new Exception("Too many rows");
                }
            }
            else 
            {
                throw new Exception("No rows");
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}
此代码改编自。我使用s添加了一些
,并使其成为单行。我甚至不想知道为什么MSDN示例没有完整地使用


请注意,
SqlDataAdapter
用于恢复多行/大数据,并将它们放入
数据集中。您可以将它们用于单行数据,但是如果您只想填充一些变量,那么简单地使用
SqlDataReader
要容易得多。

使用ADO.NET,可能与此类似

    //SQL query that returns todays sessions for the given roomID
string query = @"SELECT SessionID, RoomID, SessionDate, SessionTimeStart, SessionTimeEnd" +
                " FROM [Session] " +
                " WHERE RoomID = @RoomID " +
                " AND SessionDate = cast(getdate() as date) ";

using (var connection = new SqlConnection(ConnStr))
using (var command = new SqlCommand(query, connection))
{
    command.Parameters.Add("RoomID", SqlDbType.Char).Value = RoomID;

    try
    {
        connection.Open();

        using (SqlDataReader reader = command.ExecuteReader())
        {
            if (reader.Read())
            {
                // Note that reader[x] has the equivalent type to the type
                // of the returned column, converted using
                // http://msdn.microsoft.com/en-us/library/cc716729.aspx
                // .ToString() if the item isn't null is always ok
                string SessionIDstring = reader[0].ToString(); // it should be an int

                // reading it twice is ok
                int RoomID = (int)reader[1]; // it should be an int
                string RoomIDstring = reader[1].ToString(); // it should be an int

                if (reader.Read())
                {
                    throw new Exception("Too many rows");
                }
            }
            else 
            {
                throw new Exception("No rows");
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}
此代码改编自。我使用
s添加了一些
,并使其成为单行。我甚至不想知道为什么MSDN示例没有完整地使用


请注意,
SqlDataAdapter
用于恢复多行/大数据,并将它们放入
数据集中。您可以将它们用于单行数据,但如果您只想填充一些变量,则只需使用
SqlDataReader
就更容易了。

您可以创建这样的类

public class SessionDto
{
    public string SessionID {get; set;}  
    public string RoomID {get; set;}     
    public string SessionDate {get; set;} 
    public string SessionTimeStart {get; set;} 
    public string SessionTimeEnd {get; set;} 
}
然后使用一个方法获取房间ID并构建会话对象

public SessionDto GetSessionData(int roomId)
{
    using (var cnn = new SqlConnection(ConnStr))
    {
        SessionDto sessionDto;

        string query = @"SELECT SessionID, RoomID, SessionDate, SessionTimeStart, SessionTimeEnd" +
       " FROM [Session] " +
       " WHERE RoomID = @RoomID " +
       " AND SessionDate = cast(getdate() as date) ";


        cnn.Open();
        using (var cmd = new SqlCommand(query,cnn))
        {
            cmd.Parameters.Add("@RoomID", SqlDbType.Char).Value = roomId;

            using (var rdr = cmd.ExecuteReader())
            {
                if (rdr.HasRows)
                {
                    while (rdr.Read())
                    {
                        sessionDto = new sessionDto{
                            SessionID = rdr.GetString(0),
                            RoomID = rdr.GetString(1),
                            SessionDate = rdr.GetString(2),
                            SessionTimeStart = rdr.GetString(3),
                            SessionTimeEnd = rdr.GetString(4)
                        };
                    }
                }
            }
        }
    }
    return sessionDto;
}
很多都是手写的,因为我现在还没有访问VS, 但你应该让它发挥作用


另外,我使用了
rdr.GetString()
,还有其他方法用于
GetType()

您可以创建这样的类

public class SessionDto
{
    public string SessionID {get; set;}  
    public string RoomID {get; set;}     
    public string SessionDate {get; set;} 
    public string SessionTimeStart {get; set;} 
    public string SessionTimeEnd {get; set;} 
}
然后使用一个方法获取房间ID并构建会话对象

public SessionDto GetSessionData(int roomId)
{
    using (var cnn = new SqlConnection(ConnStr))
    {
        SessionDto sessionDto;

        string query = @"SELECT SessionID, RoomID, SessionDate, SessionTimeStart, SessionTimeEnd" +
       " FROM [Session] " +
       " WHERE RoomID = @RoomID " +
       " AND SessionDate = cast(getdate() as date) ";


        cnn.Open();
        using (var cmd = new SqlCommand(query,cnn))
        {
            cmd.Parameters.Add("@RoomID", SqlDbType.Char).Value = roomId;

            using (var rdr = cmd.ExecuteReader())
            {
                if (rdr.HasRows)
                {
                    while (rdr.Read())
                    {
                        sessionDto = new sessionDto{
                            SessionID = rdr.GetString(0),
                            RoomID = rdr.GetString(1),
                            SessionDate = rdr.GetString(2),
                            SessionTimeStart = rdr.GetString(3),
                            SessionTimeEnd = rdr.GetString(4)
                        };
                    }
                }
            }
        }
    }
    return sessionDto;
}
很多都是手写的,因为我现在还没有访问VS, 但你应该让它发挥作用


另外,我使用了
rdr.GetString()
,还有其他方法用于
GetType()

当您说要将查询结果转换为字符串时,我们是在说c变量吗?在这种情况下,您可以使用一个简单的DataReader将查询和.GetString()解析为每个变量。你能给我举一个DataReader和解析引用我问题中数据的例子吗?谷歌将向你展示数千个这样的例子。这正是您想要的。当您说希望查询结果变成字符串时,我们是在说c#变量吗?在这种情况下,您可以使用一个简单的DataReader将查询和.GetString()解析为每个变量。你能给我举一个DataReader和解析引用我问题中数据的例子吗?谷歌将向你展示数千个这样的例子。这正是你想要的,就是这样!谢谢你@xanatos。读者[x]提到的专栏文章对我帮助很大@jaspernorth更新了代码以包含参数化查询+1因为您正在使用参数。就是这样!谢谢你@xanatos。读者[x]提到的专栏文章对我帮助很大@jaspernorth更新了代码以包含参数化查询+1因为您正在使用参数。非常有用。谢谢你@jaspernorth,使用它可以返回一个对象,并使用对象属性而不是字符串。非常有用。谢谢你@jaspernorth,使用它可以返回一个对象,并使用对象属性而不是字符串。