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;
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;