2014-10-03 91 views
0

我正在重寫舊的webforms應用程序的一部分。我想做一個中央功能,將執行選擇查詢。我會爲它提供SQL查詢和參數,剩下的工作就完成了。將MySqlDataReader存儲在變量中

到目前爲止,我有這樣的:

MySqlDataReader DoRead(string query, params MySqlParameter[] pms) 
{ 
    MySqlCommand myCommand; 

    if (!myConnection) 
     myConnection = new MySqlConnection(sCon); 

    if (myConnection.State != ConnectionState.Open) 
    { 
     myConnection.Close(); 
     myConnection.Open(); 
    } 

    myCommand    = myConnection.CreateCommand(); 
    myCommand.CommandText = query; 
    foreach (MySqlParameter p in pms) 
    { 
     myCommand.Parameters.Add(p); 
    } 

    return myReader = myCommand.ExecuteReader(); 
} 

我的問題是,我可以的myReader結果保存到一個變量,並返回同一個變量,而不是myReader只是這樣我就可以立即關閉連接和讀者在函數中代替主代碼

+1

是的,你可以肯定。您可以將結果集保存在DataTable中,然後返回該DataTable。除此之外,我在上面發佈的代碼中看到了一些邏輯錯誤。 – Rahul 2014-10-03 13:09:58

+0

簡答:是的。只需將讀取器中的所有數據讀入「DataTable」或「List 」,關閉連接並返回該數據表或列表。但請注意 - 您不應該存儲datareader本身,而是從中讀取數據並存儲數據。 – 2014-10-03 13:13:58

回答

2

當然。而這正是你應該做的事情,對於完全相同的原因,你聲明:

這樣我就可以立即關閉連接和讀者的功能

你面臨的問題是使用首先是閱讀器本身與開放數據流耦合。所以如果消費代碼期望讀者,它將不得不改變以解決這個問題。

應用程序以後如何使用此讀取器?如果你想要創建一個通用函數,那麼結果也需要非常通用。因此,如果使用代碼都是爲讀者做定製事情,那麼也許你可以返回一個DataSet,消費代碼可以用它來做自定義的事情。事情是這樣的:

var result = new DataSet(); 

using(var myConnection = new MySqlConnection(sCon)) 
{ 
    myConnection.Open(); 
    var myCommand = myConnection.CreateCommand(); 
    myCommand.CommandText = query; 
    foreach (var p in pms) 
     myCommand.Parameters.Add(p); 
    var myAdapter = new MySqlDataAdapter(myCommand); 

    myAdapter.Fill(result); 
} 

return result; 

(請注意,我在這裏做的另一個變化,以及該連接對象也應該是本地的方法的範圍共享連接對象開拓一片天地的潛在問題,之一。其中你無疑試圖用這個條件來解決關閉/打開連接狀態的問題,只要完全避免這個問題的世界,並且一旦完成它們就可以處理連接。)