【问题标题】:How to populate list or array with values from access database如何使用 access 数据库中的值填充列表或数组
【发布时间】:2016-01-27 14:27:24
【问题描述】:

我正在尝试使用我有权访问的数据库中某个属性 (PlayerName) 中的一些值填充 C# windows 窗体中的一组标签。

目前我唯一的代码是:

OleDbConnection connection = new OleDbConnection(CONNECTION STRING HERE);

OleDbCommand command = new OleDbCommand();
command.Connection = connection;
command.CommandText = "SELECT PlayerName FROM [TotalPlayerName] WHERE Team = 1 AND SportID = " + Form1.IDNumber;

我需要一个包含这些值的列表或数组,以便我可以使用它们来填充标签,但我不知道如何执行此操作。

【问题讨论】:

标签: c# arrays visual-studio ms-access ms-access-2010


【解决方案1】:

您需要调用ExecuteReader 来获取数据读取器,然后像这样循环遍历结果集的行:

List<string> result = new List<string>();

using (var reader = command.ExecuteReader())
{
    while (reader.Read())
    {
        result.Add(reader.GetString(0));
    }
}

在你这样做之前,不要忘记像这样打开连接:

connection.Open();

【讨论】:

    【解决方案2】:

    这里有几件事......为了最佳实践,它更标准的实践......正如我想说的!

    使用 USING 因为这会在连接后进行清理.. 请参阅此处以获取很好的示例 in a "using" block is a SqlConnection closed on return or exception?

    using (OdbcDataReader DbReader = DbCommand.ExecuteReader())
        {
           int fCount = DbReader.FieldCount;
           while (DbReader.Read())
             {
                  Label1 = DbReader.GetString(0);
                  Label2 = DbReader.GetString(1);
                  Label3 = DbReader.GetString(2);
                  Label4 = DbReader.GetString(3);
    
                  for (int i = 0; i < fCount; i++)
                    {
                       String col = DbReader.GetString(i);
                        Console.Write(col + ":");
                    }
                    Console.WriteLine();
            }
    }
    

    注意您的 SQL 目前只返回 1 个字段 /String

    【讨论】:

      【解决方案3】:

      在读取数据的同时填充列表

      List<string> players = new List<string>();
      
      OleDbDataReader rdr = command.ExecuteReader();
      While(rdr.Read())
      {
        players.Add(rdr["PlayerName"].ToString());
      }
      

      【讨论】:

        【解决方案4】:

        您需要创建一个OleDbReader 对象来读取查询的响应。您还需要创建一个列表来存储数据,如下所示:

        List<string> playerNameList = new List<string>(); 
        using (OleDbReader r = command.ExecuteReader())
        {
           while(reader.Read())
           {
             playerNameList.Add(reader.GetString(0));
           }
        }
        

        【讨论】:

          【解决方案5】:

          一种选择可能是使用OleDbDataAdapter 填充DataTable 那些返回查询的值;

          var dt = new DataTable();
          using(var da = new OleDbDataAdapter(command))
          {
              da.Fill(dt);
          }
          

          而且由于您的查询返回一列,您可以使用AsEnumerable那个 数据表将它们作为string 之类的;

          List<string> list = dt.AsEnumerable()
                                .Select(r => r.Field<string>("PlayerName"))
                                .ToList();
          

          您可以阅读:Queries in LINQ to DataSet

          顺便说一句,您应该始终使用parameterized queries。这种字符串连接对SQL Injection 攻击开放。

          还可以使用 using statement 自动处理您的连接和命令,就像我在示例中对 OleDbDataAdapter 所做的那样。

          【讨论】:

          • 如果它是一个列表,那么我会跳过数据表的开销和步骤
          • @Frisbee 好吧,有点同意。在这种情况下使用ExecuteReader 会更好一些。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-22
          • 2014-08-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多