我正在我的应用程序中实现一个数据库管理器类,主要是因为有3个数据库连接到一个本地数据库。
但是返回函数不起作用,我知道查询会带回行但是当它返回时它有0。我缺少什么?
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;
}*/
}
}
获取结果的代码
query = @"SELECT jobtypeid, title FROM jobtypes WHERE active = 'Y' ORDER BY title ASC";
//parentfrm.jobtypes = db.localfetchrows(query);
var rows = db.localfetchrows(query);
Console.WriteLine("Reading data : " + rows.HasRows + rows.FieldCount);
while (rows.Read()){
}
这些脚本返回以下内容:
Connecting local : 5.5.16
Reading data : True2
Reading data : False0
答案 0 :(得分:2)
您希望从DataReader
中返回using-statement
,这将隐含地关闭基础连接。
而不是返回DataReader
我会建议遵循模式。你可以得到IEnumerable<IDatarecord>
。
public IEnumerable<IDataRecord> localfetchrows(string query, List<MySqlParameter> dbparams = null)
{
using (var conn = connectLocal())
{
MySqlCommand sql = conn.CreateCommand();
sql.CommandText = query;
if (dbparams != null)
{
if (dbparams.Count > 0)
{
sql.Parameters.AddRange(dbparams.ToArray());
}
}
conn.Open();
using (IDataReader rdr = sql.ExecuteReader())
{
while (rdr.Read())
{
yield return (IDataRecord)rdr;
}
}
}
}
您可以通过以下方式调用它:
var records = localfetchrows(query);
foreach (var rec in records.Take(10))
{
Console.WriteLine("Reading data : " + rec.FieldCount);
}
因此,您不需要将所有内容加载到内存中,只需占用一小部分内容即可。
答案 1 :(得分:1)
使用块在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;
}
}
答案 2 :(得分:1)
using (var conn = connectLocal())
您将连接放在using语句中,因此在到达此行后关闭并处理连接:
return reader;
换句话说,当调用者返回reader
时,您已关闭数据库连接并且无法获取行。读取行时必须打开连接。
答案 3 :(得分:0)
在我看来,在使用阅读器之前,您正在处理连接。只有在完成阅读器后才能尝试处理连接。