2012-07-09 76 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; 
    } 
}