2010-11-18 8 views
1

SQL Serverに7つの結果セットを返すストアドプロシージャがあります。私はASP.NETからこのストアドプロシージャを呼び出して、ASP.NETページ上の7つのGridViewに結果を設定したいと思います。私はデータを取得するためにSqlDataReaderを使用していますが、GridViewを満たすためにC#コードに苦労しています。複数のGridViewコントロールを1つのストアドプロシージャから取り込む方法は?

私がデータを取得するために、DALのクラスを作成していると私はそこに、このメソッドを持って

public SqlDataReader CheckDataIntegrity() 
{ 
    SqlCommand cmd = new SqlCommand("cc.DataCheck"); 
    return MultipleResults(cmd); 
} 

ヘルパーメソッドMultipleResultsは次のようになります。私は呼んしようとしている

private SqlDataReader MultipleResults(SqlCommand cmd) 
{ 
    SqlConnection con = new SqlConnection(_connectionString); 
    cmd.Connection = con; 

    con.Open(); 
    SqlDataReader dr = cmd.ExecuteReader(); 
    con.Close(); 
    return dr; 

} 

私のページのコンポーネントは次のようなものです:

private void FillGridViews()   
{ 
    DBUtil DB = new DBUtil(); 
    using (SqlDataReader dr = DB.CheckDataIntegrity()) 
    { 
     if (dr.HasRows) 
     { 
      while (dr.Read()) 
      { 
       GridView1.DataSource = dr; 
       GridView1.DataBind(); 
      } 
     } 
    } 
} 

これは何も見つかりませんでした。

リソースを知っていますか、または共有する小さな例がありますか?

ありがとうございました。

+0

multipleResultsメソッドでは、SqlConnectionをusingステートメントで囲む必要があります。 – Lareau

+0

@Laraeu - これは何の違いもなく、私はまだ 'リーダーが閉じたときにHasRowsを呼び出す試みが無効です。 ' –

+0

答えのコメントにあなたが持っていた問題を見ました。 MultiResultsのパラメータを変更して、sqlconnectionを受け入れるようにして、効率的に開閉を管理することを検討します。 – Lareau

答えて

1

DataReaderの.NextResult() methodを使用して、最初の結果セットから次のセットに進む必要があります。このメソッドは、結果がセットに存在する場合はTrueを、そうでない場合はFalseを返します。

.NextResult()を呼び出した後、GridViewを現在の結果セットにバインドできます。

あなたのコードは次のようになります。

SqlDataReader dr = DB.CheckDBIntegrity(); 

while (!dr.NextResult()) 
    { 
     // bind results to appropriate grid 
    } 
+0

私の質問でコードを更新しました。このエラーが発生しました。「読者が閉じたときにHasRowsを呼び出す試みが無効です。」これは混乱します。 –

+0

@マーク:これは、データレディタでデータを読み書きする前に、データベースへの接続をクローズしているためです。 – Jazza

+0

MultipleResultsメソッドからcon.Close()を削除しましたが、同じエラーが発生しました: 'リーダーが閉じられたときにHasRowsを呼び出す呼び出しが無効です。 ' –

4

あなたのGridViewsにバインドするための複数のテーブルを持つことができたDataSetを使用する必要があります。

var dataset = GetDataSetForMy7GridViews(); 

// also valid: dataset.Tables["TableName"]; 
GridView1.DataSource = dataset.Tables[0]; 
GridView1.DataBind(); 

GridView2.DataSource = dataset.Tables[1]; 
GridView2.DataBind(); 

GridView3.DataSource = dataset.Tables[2]; 
GridView3.DataBind(); 

GridView4.DataSource = dataset.Tables[3]; 
GridView4.DataBind(); 

GridView5.DataSource = dataset.Tables[4]; 
GridView5.DataBind(); 

GridView6.DataSource = dataset.Tables[5]; 
GridView6.DataBind(); 

GridView7.DataSource = dataset.Tables[6]; 
GridView7.DataBind(); 

7つの異なるGridViewにバインドするので、このようにする必要があります。あなたのコードに従って行う場合:

>    while (dr.Read()) 
>    { 
>     GridView1.DataSource = dr; 
>     GridView1.DataBind(); 
>    } 

これは1 GridViewにのみバインドされます。

が追加されました: 多分、このリンクはあなたの質問に対する答えですか? http://www.codeguru.com/csharp/csharp/cs_network/database/article.php/c8715

+0

これはまさに私の思考は、その最高のシンプルさ、私から+1を取得します。解決のおかげで – Dal

+0

ありがとうございます。私はSqlDataReaderと比較してパフォーマンスが低いため、Datasetから離れようとしていました。しかし、SqlDataReaderソリューションを動作させることができない場合は、DataSetを使用する必要があります。返信いただきありがとうございます。 –

+0

マーク、私は私の答えへのリンクを追加しました。あなたにちょっと役立つかどうかチェックしてください。 – Arief

関連する問題