【问题标题】:Returning multiple variables from SQL query从 SQL 查询返回多个变量
【发布时间】:2013-08-15 13:49:26
【问题描述】:

我的表结构如下:

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 个查询?

【问题讨论】:

  • 当您说要将查询结果转换为字符串时,我们是在谈论 c# 变量吗?在这种情况下,您可以只使用一个简单的 DataReader 来解析您的查询并将 .GetString() 解析到每个变量中。
  • 是的,我在 C# 回答之后。您能否举一个 DataReader 的示例并参考我的问题中的数据进行解析?
  • Google 将向您展示数千个这样的示例。
  • 查看下面的@xanatos 答案。这正是您想要的。

标签: c# sql database tsql variables


【解决方案1】:

类似的东西,也许,使用 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);
    }
}

此代码改编自 MSDN ADO.NET Code Examples。我添加了一些usings 并将其设为单行。我什至不想知道为什么 MSDN 示例没有完整地使用 using

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

【讨论】:

  • 就是这样!谢谢@xanatos。您的读者[x] 指的是列,对我帮助很大!
  • @jaspernorth 更新了代码以包含您的参数化查询。 +1,因为您正在使用参数。
【解决方案2】:
declare @col1 int
declare @col2 varchar(42)

select  @col1 = col1
,       @col2 = col2
,       ....

【讨论】:

    【解决方案3】:

    你可以像这样创建一个类...

    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()还有其他方法。

    【讨论】:

    • 非常有帮助。谢谢!
    • @jaspernorth,通过它你可以返回一个对象,并使用对象属性而不是使用字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 2014-06-11
    • 2019-09-26
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多