C# 从类返回0行的mysql数据读取
我正在我的应用程序中实现一个数据库管理器类,主要是因为有3个数据库要连接到一个本地数据库 但是return函数不起作用,我知道查询会返回行,但当类返回时,它有0。我错过了什么C# 从类返回0行的mysql数据读取,c#,mysql,mysqldatareader,C#,Mysql,Mysqldatareader,我正在我的应用程序中实现一个数据库管理器类,主要是因为有3个数据库要连接到一个本地数据库 但是return函数不起作用,我知道查询会返回行,但当类返回时,它有0。我错过了什么 public MySqlDataReader localfetchrows(string query, List<MySqlParameter> dbparams = null) { using (var conn = connectLocal()) {
public MySqlDataReader localfetchrows(string query, List<MySqlParameter> dbparams = null)
{
using (var conn = connectLocal())
{
Console.WriteLine("Connecting local : " + conn.ServerVersion);
MySqlCommand sql = conn.CreateCommand();
sql.CommandText = query;
if (dbparams != null)
{
if (dbparams.Count > 0)
{
sql.Parameters.AddRange(dbparams.ToArray());
}
}
MySqlDataReader reader = sql.ExecuteReader();
Console.WriteLine("Reading data : " + reader.HasRows + reader.FieldCount);
return reader;
/*
using (MySqlCommand sql = conn.CreateCommand())
{
sql.CommandText = query;
if (dbparams != null)
{
if (dbparams.Count > 0)
{
sql.Parameters.AddRange(dbparams.ToArray());
}
}
MySqlDataReader reader = sql.ExecuteReader();
Console.WriteLine("Reading data : " + reader.HasRows + reader.FieldCount);
sql.Parameters.Clear();
return reader;
}*/
}
}
这些脚本返回以下内容:
Connecting local : 5.5.16
Reading data : True2
Reading data : False0
您希望从
using语句中返回数据读取器
,该语句将隐式关闭基础连接
我建议使用以下模式,而不是返回DataReader
。你可以让步
因此,您不需要将所有数据加载到内存中,只需获取其中的一小部分。您希望从using语句中返回一个数据读取器,该语句将隐式关闭底层连接
我建议使用以下模式,而不是返回DataReader
。你可以让步
因此,您不需要将所有内容加载到内存中,只需获取其中的一小部分。在我看来,您在使用读卡器之前正在处理连接。只有在使用完读卡器后,才尝试断开连接。在我看来,您是在使用读卡器之前断开连接的。只有在处理完读卡器后,才可以尝试处理连接。当从MySqlConnection块退出时,您的读卡器没有可使用的连接,您可以在MySqlConnection块中创建读卡器
一个可能的解决方案,但效率较低,是使用Fill方法获取数据集。
这不仅效率较低,而且,如果需要处理数据行,您会发现自己在这些行上再次循环
public DataSet localfetchrows(string query, List<MySqlParameter> dbparams = null)
{
DataSet ds;
using (var conn = connectLocal())
{
Console.WriteLine("Connecting local : " + conn.ServerVersion);
MySqlCommand sql = conn.CreateCommand();
sql.CommandText = query;
if (dbparams != null)
{
if (dbparams.Count > 0)
{
sql.Parameters.AddRange(dbparams.ToArray());
}
}
MySqlDataReader reader = sql.ExecuteReader();
Console.WriteLine("Reading data : " + reader.HasRows + reader.FieldCount);
reader.Fill(ds);
return ds;
}
}
公共数据集localfetchrows(字符串查询,列表dbparams=null)
{
数据集ds;
使用(var conn=connectLocal())
{
Console.WriteLine(“连接本地:+conn.ServerVersion”);
MySqlCommand sql=conn.CreateCommand();
sql.CommandText=查询;
if(dbparams!=null)
{
如果(dbparams.Count>0)
{
AddRange(dbparams.ToArray());
}
}
MySqlDataReader=sql.ExecuteReader();
Console.WriteLine(“读取数据:+reader.HasRows+reader.FieldCount”);
读卡器。填写(ds);
返回ds;
}
}
您使用块在MySqlConnection中创建读卡器,当从该块退出时,您的读卡器没有可使用的连接
一个可能的解决方案,但效率较低,是使用Fill方法获取数据集。
这不仅效率较低,而且,如果需要处理数据行,您会发现自己在这些行上再次循环
public DataSet localfetchrows(string query, List<MySqlParameter> dbparams = null)
{
DataSet ds;
using (var conn = connectLocal())
{
Console.WriteLine("Connecting local : " + conn.ServerVersion);
MySqlCommand sql = conn.CreateCommand();
sql.CommandText = query;
if (dbparams != null)
{
if (dbparams.Count > 0)
{
sql.Parameters.AddRange(dbparams.ToArray());
}
}
MySqlDataReader reader = sql.ExecuteReader();
Console.WriteLine("Reading data : " + reader.HasRows + reader.FieldCount);
reader.Fill(ds);
return ds;
}
}
公共数据集localfetchrows(字符串查询,列表dbparams=null)
{
数据集ds;
使用(var conn=connectLocal())
{
Console.WriteLine(“连接本地:+conn.ServerVersion”);
MySqlCommand sql=conn.CreateCommand();
sql.CommandText=查询;
if(dbparams!=null)
{
如果(dbparams.Count>0)
{
AddRange(dbparams.ToArray());
}
}
MySqlDataReader=sql.ExecuteReader();
Console.WriteLine(“读取数据:+reader.HasRows+reader.FieldCount”);
读卡器。填写(ds);
返回ds;
}
}
使用(var conn=connectLocal())
您将连接放置在using语句中,从而在到达此行后关闭并处理连接:
return reader;
换句话说,当调用方返回读取器时,您已经关闭了数据库连接,无法获取行。读取行时必须打开连接。使用(var conn=connectLocal())
您将连接放置在using语句中,从而在到达此行后关闭并处理连接:
return reader;
换句话说,当调用方返回读取器时,您已经关闭了数据库连接,无法获取行。读取行时必须打开连接
return reader;