MySqlDataReader 只返回第一行

MySqlDataReader returning only first row

public string GetAllProducts()
    {
        string connStr = "server=localhost;user=root;database=tp1;port=3306;password=";
        MySqlConnection conn = new MySqlConnection(connStr);
        try
        {
            Console.WriteLine("Connecting to MySQL...");
            conn.Open();

            string sql = "SELECT * FROM material";
            MySqlCommand cmd = new MySqlCommand(sql, conn);
            MySqlDataReader rdr = cmd.ExecuteReader();

            while (rdr.Read())
            {
                return (rdr[0] + " -- " + rdr[1] + " -- " + rdr[2] + " -- " + rdr[3]);
            }
            rdr.Close();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }

        conn.Close();
        Console.WriteLine("Done.");


        return "No records found";
    }

此时我在“material”table 上有四个条目。只返回第一个。

这是输出:

SWAGGER OUTPUT

'material' content

您在读取数据的循环中放置了一个 return。 Loop 因此不会以循环方式执行!

实际上,您的代码应该更像:

public List<Product> GetAllProducts()
{
    string connStr = "server=localhost;user=root;database=tp1;port=3306;password=";

    using var conn = new MySqlConnection(connStr);
    conn.Open();

    string sql = "SELECT * FROM material";
    using var cmd = new MySqlCommand(sql, conn);
    using var rdr = cmd.ExecuteReader();
    var products = new List<Product>();
    while (rdr.Read())
    {
         var p = new Product(
           rdr.GetInt32(0), //id
           rdr.GetString(1), //ref
           rdr.GetString(2), //name
           rdr.GetInt32(3) //qty
         );
         products.Add(p);
    }
    return products;
}

public record Product(int Id, string Ref, string Name, int Qty);

(try/catch 为清楚起见已删除;请随时将其放回原处)

请注意,此 C# 使用了较新的功能,例如记录和使用 var;如果您遇到语法错误,请告诉我它们是什么,以便我可以建议与您的 C# 版本兼容的不同语法


顺便说一下,我发现这种从数据库中获取数据的方式非常乏味。你可以通过安装一个名为 Dapper 的库来大幅减少它。使用 Dapper,我上面写的所有代码都减少为:

public List<Product> GetAllProducts()
{
    string connStr = "server=localhost;user=root;database=tp1;port=3306;password=";

    using var conn = new MySqlConnection(connStr);
    return conn.Query<Product>("SELECT * FROM material").ToList();
}

如果您想参数化查询:

public List<Product> GetAllProductsNamed(string n)
{
    string connStr = "server=localhost;user=root;database=tp1;port=3306;password=";

    using var conn = new MySqlConnection(connStr);
    return conn.Query<Product>(
      "SELECT * FROM material WHERE name = @theName", 
      new{ theName = n }
    ).ToList();
}

如果您不打算使用像 EF 这样的高性能 ORM,那么生命太短暂了 使用 Dapper(无从属关系):)

您在第一个 Read() 之后返回,请尝试这样的操作:

var output = string.Empty;

while (rdr.Read())
{
   output += (rdr[0] + " -- " + rdr[1] + " -- " + rdr[2] + " -- " + rdr[3]);
}
rdr.Close();

return output;