2017-05-27 8 views
-1

私はmysqlデータリーダーを返すメソッドを作成しました。aspネットコア - 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が正しくに付加価値化され、この行にnull参照の例外が発生します。

どうすれば修正できますか?何が間違っているのですか?

+0

リーダーが使用している基本接続が閉じている場合、リーダーは使用できません。このアプローチは動作しません。 – Steve

+0

@Steveあなたは 'MySqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);'行が正しくないのですか? 'CommandBehavior.Default'を使用しても、それは動作しません... – FabioBit

+0

_"この行にヌル参照例外があります。 "return reader;' "_ - これは不可能です。 'return'文は式の値を返します。この場合は' reader'です。 'reader'が' null'の場合、 'null'値が返されます。それは例外をスローするつもりはない。私はあなたが返す前にあなたのオブジェクトを処分することができないことを説明するコメントに同意し、それが動作することを期待しています。しかし、あなたの質問は、最初に妥当なエラーシナリオを説明するものではありません。 'NullReferenceException'が本当にあなたが求めているものであれば、マークされた重複を見てください。それ以外の場合は、質問を修正してください –

答えて

0

問題は、接続の作成を中心に使用することです。使用ブロックを終了すると、すべてが破棄されます。したがって、DataReaderは、使用ブロックに配置された接続を使用できないため、機能しません。

最初の非常に簡単な回避策を使用してブロック内のループを実行することであり、各ロードされたレコードにデリゲートが入力で受信された呼は、発呼者がこのようにFillWithDataReaderを呼び出すことができ

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("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

関連する問題