2012-07-09 85 views
1

我正在我的应用程序中实现一个数据库管理器类,主要是因为有3个数据库连接到一个是本地的。mysql数据读取返回0行

但是,返回函数不工作,我知道查询带回行,但是当它由类返回时,它有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 

回答

1

using (var conn = connectLocal())

你将using语句内部的连接循环,从而关闭和处置的连接你到该行后:

return reader; 

换句话说,当主叫方得到reader回来,你已经关闭了数据库连接,不能读取该行秒。读取行时必须打开连接。

2

你想从一个using-statement内返回DataReader将关闭底层连接隐含。

而不是返回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); 
} 

所以你并不需要全部加载到内存中只是利用它的一小部分。

0

对我来说,就像你在使用阅读器之前处理连接一样。只有在阅读器完成后才尝试处理连接。

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