【问题标题】:C#, MySQL, looping.reading through rows and storing multiple valuesC#、MySQL、循环。读取行并存储多个值
【发布时间】:2020-05-04 02:08:31
【问题描述】:

我有一个 MySQL 数据库,其中有一个名为 nextcare_form 的表。 表中大约有 15 列并且没有唯一键,每个信息都可以重复。 我怎样才能有一个循环遍历行,并在每次迭代时将不同列的值存储在不同的变量中?

谢谢。

【问题讨论】:

  • 这在所有 ADO.NET 教程中都有描述 - 无论您使用什么数据库,它都是一样的。它也显示在 Connector/MySQL 的文档中。你试过了吗?

标签: c# mysql wpf ado.net


【解决方案1】:

我认为@William Xifaras 的 Dapper 想法可能是最好的解决方案,但这里是您现有技术的解决方案。

我使用了一个 DataTable,所以我可以在 DataTable 填满后立即关闭连接。我可以在连接关闭后操作DataTable中的数据。

我使用 List 将您的数据存储在变量中。

使用块确保您的数据库对象即使出现错误也已关闭和处置。

    public class NextCare
    {
        public string Field1 { get; set; }
        public string Field2 { get; set; }
        public string Field3 { get; set; }
        public NextCare(string f1, string f2, string f3)
        {
            Field1 = f1;
            Field2 = f2;
            Field3 = f3;
        }
    }

    private List<NextCare> OpCode()
    {
        DataTable dt = new DataTable();
        List<NextCare> lst = new List<NextCare>();
        using (MySqlConnection cn = new MySqlConnection("Your connection string"))
        using (MySqlCommand cmd = new MySqlCommand("SELECT * FROM nextcare_form;", cn))
        {
            cn.Open();
            dt.Load(cmd.ExecuteReader());
        }
        foreach (DataRow row in dt.Rows)
        {
            NextCare nc = new NextCare(row[0].ToString(), row[1].ToString(), row[2].ToString());
            lst.Add(nc);
        }
        return lst;
    }

【讨论】:

    【解决方案2】:

    首先,创建一个包含所有变量的类:

    class Item
    {
        public string Item1 {get;set;}
        public string Item2 {get;set;}
        public string Item3 {get;set;}
        .
        .
        public string Item15 {get;set;}
    
    }
    

    现在,创建一个列表:

    List<Item> items = new List<Item>();
    

    然后,执行 MySQL 命令从数据库中获取数据并循环遍历它:

    long recCount = 0;
    MySqlCommand mySqlCommand = new MySqlCommand();
    mySqlCommand.Connection = connection;
    mySqlCommand.CommandText = "SELECT COUNT(*) FROM nextcare_form";
    recCount = (Int64)mySqlCommand.ExecuteScalar();
    
    if (recCount > 0)
    {
        mySqlCommand.CommandText = "SELECT * FROM nextcare_form";
        MySqlDataReader mySqlDataReader = mySqlCommand.ExecuteReader();
    
        while (mySqlDataReader.Read())
        {
            if (!DBNull.Value.Equals(mySqlDataReader.GetValue(0)))
            {
                items.Item1 = (string)mySqlDataReader.GetValue(0);
            }
    
            if (!DBNull.Value.Equals(mySqlDataReader.GetValue(1)))
            {
                items.Item2 = (string)mySqlDataReader.GetValue(1);
            }
    
            if (!DBNull.Value.Equals(mySqlDataReader.GetValue(2)))
            {
                items.Item3 = (string)mySqlDataReader.GetValue(2);
            }
            .
            .
            .
            if (!DBNull.Value.Equals(mySqlDataReader.GetValue(14)))
            {
                items.Item15 = (string)mySqlDataReader.GetValue(14);
            }
        }
    }
    

    通过这种方式,您可以获取并存储所有值... 希望它能解决你的问题

    【讨论】:

    • 您可以将!DBNull.Value.Equals(mySqlDataReader.GetValue(0)) 替换为!mySqlDataReader.IsDBNull(0)
    • 为什么要两次命中数据库?如果没有返回记录,.Read 方法将返回 False,而 While 将永远不会运行。
    • 你没有注意到所有的红色文字吗?您忘记了 Select 字符串末尾的 "。
    • items.Item1 items 没有 Item1 属性。或 .Item2 或 .Item3 等。
    • 您在循环运行的整个过程中保持连接打开。
    【解决方案3】:

    我会避免编写所有样板 ADO.NET 代码并使用 Dapper。 Dapper 是一个微型 ORM,没有特定于 DB 的实现细节。它适用于包括 MySQL 在内的所有 .NET ADO 提供程序。它将处理将结果映射到强类型类。

    示例

    public class NextFormResult
    {
        public string Field1 { get; set; }
        public string Field2 { get; set; }
    }
    
    string sql = "SELECT * FROM nextcare_form";
    
    using (var connection = new SqlConnection("YOUR CONNECTION"))
    {            
        var nextFormResult = connection.Query<NextFormResult>(sql).ToList();
    
        // more code
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 2021-06-09
      • 2019-01-09
      • 1970-01-01
      相关资源
      最近更新 更多