2017-05-27 26 views
-1

我創建了一個方法來返回mysql數據讀取器。asp net core - NullReferenceException:如何從方法返回mysql數據讀取器?

public class DbHelper : BaseService 
{ 
    public DbHelper(string connectionString) : base(connectionString) 
    { } 
    public static MySqlDataReader GetDataReader(string query) 
    { 
     using (MySqlConnection connection = new MySqlConnection(_connectionString)) 
     { 
      connection.Open(); 
      using (MySqlCommand command = new MySqlCommand(query, connection)) 
      { 
       MySqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection); 
       return reader; 
      } 
     } 
    } 
} 

和明年我寫:

var query = ""; //here my query string 
var rdr = DbHelper.GetDataReader(query); 

while (rdr.Read()) 
{ 
} 

,但我收到這條線return reader;

_connectionStringquery正確增值的一個空引用異常。

我該如何解決?我究竟做錯了什麼?

+0

如果閱讀器使用的底層連接關閉,則不能使用閱讀器。這種方法不能工作 – Steve

+0

@Steve你的意思是行'MySqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);'是不正確的?如果我使用'CommandBehavior.Default',它無法正常工作...... – FabioBit

+0

_「我在這一行收到一個空引用異常'return reader;'」_ - 這是不可能的。一個'return'語句只是返回表達式中的值,在這個例子中是'reader'。如果'reader'爲'null',則只返回一個'null'值。它不會拋出異常。我同意這些意見,解釋說你不能在返回對象之前處理對象,並期望它能夠正常工作。但是你的問題首先並沒有描述合理的錯誤情況。如果'NullReferenceException'確實是你所問的,請看標記的副本。否則,修復問題 –

回答

0

問題是在連接的創建周圍使用。當你從使用塊中退出時,所有東西都被丟棄。因此,DataReader無法工作,因爲它無法使用在使用塊中放置的連接。

第一非常簡單的解決方法是執行使用塊內,並在每個裝載記錄呼叫在輸入端接收的代理的環路參數

public static void FillWithDataReader(string query, Action<IDataRecord> filler) 
{ 
    using (MySqlConnection connection = new MySqlConnection(_connectionString)) 
    { 
     connection.Open(); 
     using (MySqlCommand command = new MySqlCommand(query, connection)) 
     { 
      MySqlDataReader reader = command.ExecuteReader(); 
      while(reader.Read()) 
       filler(reader); 
     } 
    } 
} 

呼叫者能夠打電話給FillWithDataReader以這種方式

FillWithDataReader("SELECT something FROM somewhere", FillMyData); 
..... 

// This is called at each loop inside the FillWithDataReader  
public void FillMyData(IDataRecord record) 
{ 
    string aSomething = record.GetString(record.GetOrdinal("something")); 
    ..... 
} 

現在,讀取器用於獲取記錄的連接仍處於打開狀態,您仍然可以分離邏輯以從用於填充模型的邏輯中提取數據庫中的數據或用戶界面對象。

+0

有沒有辦法在關閉之前返回mysql數據讀取器?也許使用一個特殊的'CommandBehavior'? – FabioBit

+0

如果刪除使用連接並使用實際的CloseConnection命令行爲。但我建議你不要追求這條道路。 – Steve