2017-09-08 3 views
0

この質問は過去に聞かれたことがありますが、私は過去5日間、SOとWebをトローしています。MySqlDataReader - リーダーが閉鎖されているときに無効な読み込みをしようとしました

私は、C#を使用してMySQLデータベースからレコードを取得しようとしています。

コードは、私がアプリケーションをテストしたDataTable()にデータをバインドしようとすると、

「リーダーが閉じているときに読むために無効な試み」しかし、MySqlDataReaderは、以下の例外に

をスローし、罰金コンパイル

問題を診断できませんでした。私が見る限り、読者はそれを読む前に閉鎖されていません。

方法以下の通りです:実際のデータベース接続が正常に動作している

/// <summary> 
    /// Performs a select statement 
    /// </summary> 
    /// <param name="query">String of the SQL Query</param> 
    /// <param name="parameters">List of SQL Parameters</param> 
    /// <returns>DataTable</returns> 
    public DataTable SelectQuery(string query, List<MySqlParameter> parameters) 
    { 
     MySqlConnection connection = new MySqlConnection(connectionString); 
     MySqlCommand cmd = new MySqlCommand(query, connection); 
     foreach(MySqlParameter p in parameters) 
     { 
      cmd.Parameters.Add(p); 
     } 

     connection.Open(); 
     DataTable dt = new DataTable(); 
     dt.Load(cmd.ExecuteReader()); 
     return dt; 
    } 

、私はMySqlConnectionにに時計を置いてきたし、それが必要との接続が開いています。私は、MySQL Workbenchでテストしている

string query = "SELECT IDS_USER, USRNM, PSSWRD, USR_SALT FROM factUser WHERE USRNM = ?username"; 

、それが正しいデータを返しました:

私は、このメソッドに以下のクエリを渡しています。

MySqlCommandを見ると、パラメータはコマンドに追加されているはずです。

私は絶対的に困惑しているので、どんな助けも大歓迎です!

+0

適切なusingステートメントで

MySqlConnection connection = new MySqlConnection(connectionString); MySqlCommand cmd = new MySqlCommand(query, connection); foreach(MySqlParameter p in parameters) { cmd.Parameters.Add(p); } connection.Open(); DataTable dt = new DataTable(); MySqlDataReader reader = cmd.ExecuteReader(); dt.Load(reader); return dt; 

を設定するあなたはCommandTypeを=テキストを設定しようとしたことがありますか? – hardkoded

+0

こんにちはkblok、はい私はCommandTypeをテキストに設定しようとしましたが、まだ同じ問題があります – Smithygotlost

+0

どのようにデータテーブルを使用していますか?別のオブジェクトにデータを追加するだけで使用しているのですか、データテーブルがフレームワークで直接使用されていますか? –

答えて

0

あなたは近くですが、ExecuteReader()機能をMySqlDataReaderに設定する必要があります。また、特にSQL関連の問題でusingステートメントを使用する習慣を身につけて、接続を適切に処分しないとすぐに使い果たされるようにしてください。 usingステートメントを使用すると、項目は自動的にusingステートメントに廃棄されます。

適切な変数を持つあなたのコードは

using(MySqlConnection connection = new MySqlConnection(connectionString)){ 
    using(MySqlCommand cmd = new MySqlCommand(query, connection)){ 
      foreach(MySqlParameter p in parameters) 
      { 
       cmd.Parameters.Add(p); 
      } 

      connection.Open(); 
      DataTable dt = new DataTable(); 
      using(MySqlDataReader reader = cmd.ExecuteReader()){ 
       dt.Load(reader); 
       return dt; 
      } 
     } 
    } 
+0

こんにちはTommy、あなたの答えをありがとう、あなたが投稿したコードの両方のバージョンを試しましたが、悲しいかな、私はまだ同じ問題!私はクエリとデータベースの接続を100回以上チェックして、両方ともうまく動作します:( – Smithygotlost

+0

コード内のデータを読み込めるかどうかテストしましたか? 'MySqlDataReader reader = cmd.ExecuteReader();'行の後に、 whileループを試して、レコードを見ることができるかどうかを確認してください。'read()){//アクセス結果}' – Tommy

+0

whileループを試しましたが、変数にウォッチを入れて、4つのデータベース列とプライマリキーを見つけることができますが、結果ビューを開く – Smithygotlost

関連する問題