【问题标题】:How to generate List<String> from SQL query?如何从 SQL 查询生成 List<String>?
【发布时间】:2012-08-19 04:29:54
【问题描述】:

如果我定义了 DbCommand 来执行类似的操作:

SELECT Column1 FROM Table1

生成返回记录的List&lt;String&gt; 的最佳方法是什么?

没有 Linq 等,因为我使用的是 VS2005。

【问题讨论】:

    标签: c# sql list visual-studio-2005 dbcommand


    【解决方案1】:

    我想这就是你要找的。​​p>

    List<String> columnData = new List<String>();
    
    using(SqlConnection connection = new SqlConnection("conn_string"))
    {
        connection.Open();
        string query = "SELECT Column1 FROM Table1";
        using(SqlCommand command = new SqlCommand(query, connection))
        {
            using (SqlDataReader reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    columnData.Add(reader.GetString(0));
                }         
            }
        }
    }
    

    未经测试,但这应该可以正常工作。

    【讨论】:

    • 只是一个注释。由于您使用的是 using 块,因此无需显式关闭连接
    • 同样的评论适用于SqlDataReader
    • 我已经修改了我的答案以反映这一点。谢谢!
    【解决方案2】:

    遍历项目并添加到集合中。你可以使用Add方法

    List<string>items=new List<string>();
    using (var con= new SqlConnection("yourConnectionStringHere")
    {
        string qry="SELECT Column1 FROM Table1";
        var cmd= new SqlCommand(qry, con);
        cmd.CommandType = CommandType.Text;
        con.Open();
        using (SqlDataReader objReader = cmd.ExecuteReader())
        {
            if (objReader.HasRows)
            {              
                while (objReader.Read())
                {
                  //I would also check for DB.Null here before reading the value.
                   string item= objReader.GetString(objReader.GetOrdinal("Column1"));
                   items.Add(item);                  
                }
            }
        }
    }
    

    【讨论】:

    • 那么没有办法在不循环记录的情况下做到这一点?
    • 没有。如果您使用 DataReader,您需要遍历这些项目。如果您使用 DataTable,您可以将其获取并使用一些 LINQ,您可以将其作为字符串列表获取
    • 如何在不使用 Linq 的情况下从 DataTable 中获取 List?
    • 对不起,如果我写错了。你需要 LINQ,如果你不想循环。我猜在内部 LINQ 扩展方法也是如此
    • 好的,VB6 ADO 具有从记录集中获取数组的功能。 .NET 的功能会减少似乎很奇怪。
    【解决方案3】:

    或嵌套列表(好吧,OP 是针对单列的,这是针对多列的..):

            //Base list is a list of fields, ie a data record
            //Enclosing list is then a list of those records, ie the Result set
            List<List<String>> ResultSet = new List<List<String>>();
    
            using (SqlConnection connection =
                new SqlConnection(connectionString))
            {
                // Create the Command and Parameter objects.
                SqlCommand command = new SqlCommand(qString, connection);
    
                // Create and execute the DataReader..
                connection.Open();
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    var rec = new List<string>();
                    for (int i = 0; i <= reader.FieldCount-1; i++) //The mathematical formula for reading the next fields must be <=
                    {                      
                        rec.Add(reader.GetString(i));
                    }
                    ResultSet.Add(rec);
    
                }
            }
    

    【讨论】:

      【解决方案4】:

      如果你想查询所有列

      List<Users> list_users = new List<Users>();
      MySqlConnection cn = new MySqlConnection("connection");
      MySqlCommand cm = new MySqlCommand("select * from users",cn);
      try
      {
          cn.Open();
          MySqlDataReader dr = cm.ExecuteReader();
          while (dr.Read())
          {
              list_users.Add(new Users(dr));
          }
      }
      catch { /* error */ }
      finally { cn.Close(); }
      

      用户的构造函数会做所有的“dr.GetString(i)”

      【讨论】:

        【解决方案5】:

        其中返回的数据是一个字符串;您可以转换为不同的数据类型:

        (from DataRow row in dataTable.Rows select row["columnName"].ToString()).ToList();
        

        【讨论】:

        • 我在问题中说没有 Linq。
        【解决方案6】:

        此版本与@Dave Martin 的目的相同,但它更简洁,可以获取所有列,并且如果您不想将数据放在电子邮件、视图等上,则可以轻松操作数据。

        List<string> ResultSet = new List<string>();
        using (SqlConnection connection = DBUtils.GetDBConnection())
        {
            connection.Open();
            string query = "SELECT * FROM DATABASE";
            using (SqlCommand command = new SqlCommand(query, connection))
            {
                using (SqlDataReader reader = command.ExecuteReader())
                {
                     while (reader.Read())
                     {
                          var rec = new List<string>();
                          for (int i = 0; i <= reader.FieldCount - 1; i++)
                          {
                               rec.Add(reader.GetString(i));
                          }
                          string combined = string.Join("|", rec);
                          ResultSet.Add(combined);
                     }
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2016-12-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多