2009-06-16 13 views
1

私はC#のかなり新しいです。 私は、複数のレコードセットを必要とするページと、それを返す単一のsprocを持っています。メインレコードセットのリピータコントロールを使用しています。次に返されるレコードセットにはどうすれば到達できますか?ストアドプロシージャは複数のレコードセットを返します


これで、データソースはaspxページにあります。 NextResultを使用するには、コードビハインドページに移動する必要がありますか?ここに私のコードがあります。データソースをコードビハインドに移動し、nextresultを使用できるようにデータレアを実装するにはどうすればよいですか?

<asp:SqlDataSource ID="AssetMgtSearch" runat="server" 
       ConnectionString="<%$ ConnectionStrings:OperationConnectionString %>" 
       SelectCommand="spAssetMgtItemList" SelectCommandType="StoredProcedure"> 
      </asp:SqlDataSource> 
      <div class="contentListFullHeight"> 
       <table cellspacing="0" cellpadding="0" border="0" class="contentList"> 
        <tr> 
         <th>ShipmentID/</td> 
         <th>MaterialID/</td> 
         <th>ItemID/</td> 
        </tr> 
        <asp:Repeater ID="Repeater1" runat="server" DataSourceID="AssetMgtSearch"> 
         <ItemTemplate> 
          <tr> 
           <td colspan="3" style="border-top:solid thin blue">&nbsp;</td> 
          </tr> 
          <tr> 
           <td><%#Container.DataItem(0)%></td> 
           <td><%#Container.DataItem(1)%></td> 
           <td><%#Container.DataItem(2)%></td> 
          </tr> 
         </ItemTemplate>       
        </asp:Repeater> 
       </table> 

答えて

9

次の結果に移動するには、リーダーでNextResult()メソッドを呼び出します。

いいえ、SqlDataSourceを使用してこの操作を行うことはできません。コードビハインドを使用するか、プロシージャを別々のクエリに分割する必要があります。

+0

は秒で私を破りました。 – AllenG

+0

Lol。私は実際にそれを見なければなりませんでした。なぜなら、私は肉体でDataReaderに触れてからずっとずっとでした。 –

+0

私は正しい方向に向いてくれてありがとう。私は、あなたが私の経験不足のためにもう少し詳しく説明することを望んでいます。 – Praesagus

2

皆様お返事ありがとうございます。 NextResult()はドラッグ&ドロップコントロールの作成からかなりの変更を加えればうまくいきます。どうぞ。

  1. DataReaderオブジェクトを返しますあなたの分離コード内の関数を作成してRepeaterコントロール
  2. からDataSourceIDプロパティを削除aspxページから
  3. をデータソースを削除します。例えばAstMgtDrは()あなたのページの負荷で
  4. は、ページレベルのディレクティブを追加し、あなたのaspxページの上部にRepeaterコントロール

    Repeater1.DataSource = AstMgtDr();

    Repeater1.DataBind();

  5. のデータソースとデータバインドのプロパティを設定します"System.Data.Common"を使用する 名前空間 <%@ Import namespace="System.Data.Common" %>

  6. 我々のデータ:

は、これが最良の 性能を持つ方法ですが、これはフィールド 名を使用して別の方法である

`<%#((DbDataRecord)Container.DataItem).GetInt32(0)%>` 

を入力して、明示的 を必要とする - よりも高価前の方法は ですが、デフォルトの評価よりも高速です。

`<%# ((DbDataRecord)Container.DataItem)["ShipmentID"] %>` 

これは他の誰かいくつかの時間を節約できます願っています。

0

この質問は複数回に分かれていて、自分の解決策を提出したかっただけです。
私はオリジナルの質問がC#であることを知っていますが、私はレガシーシステムをサポートしており、コードを変換するのは簡単です。

これは今日私のために現れた。 7つの異なるデータセットを返したストアドプロシージャの結果を表示するには、すばやく簡単な方法が必要でした。

私はSystem.Data.DataSetをストアドプロシージャの結果で埋めてこの問題に取り組みました。その後、DataGridを動的に作成し、それらをPlaceHolderに追加します。

HTMLコード:

<html> 
    <body> 
    <form id="form1" runat="server"> 
    <asp:PlaceHolder ID="phMetrics" runat="server"/> 
    </form> 
    </body> 
</html> 

VB.NETコード:

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load 
    Dim ds As System.Data.DataSet = Me.GetMetrics() 
    If ds IsNot Nothing Then 
     For i As Integer = 0 To ds.Tables.Count - 1 
      Dim _rpt As New System.Web.UI.WebControls.DataGrid() 
      With _rpt 
       .AutoGenerateColumns = True 
       .Attributes.Add("name", "table_" & i + 1) 
       .DataSource = ds.Tables(i) 
       .DataBind() 
      End With 
      Me.phMetrics.Controls.Add(_rpt) 
     Next 
    End If 
End Sub 

Private Function GetMetrics() As System.Data.DataSet 
    Dim dsMetrics As New System.Data.DataSet 

    Using _sqlConn As New System.Data.SqlClient.SqlConnection(_sqlConnString) 
     _sqlConn.Open() 
     Dim _SqlCommand As New System.Data.SqlClient.SqlCommand("[dbo].[My_Stored_Procedure]", _sqlConn) 
     With _SqlCommand 
      .CommandType = System.Data.CommandType.StoredProcedure 
      .Parameters.Add(New System.Data.SqlClient.SqlParameter("@ClientID", 101)) 
     End With 
     Dim _sqlAdapter As New System.Data.SqlClient.SqlDataAdapter(_SqlCommand) 
     With _sqlAdapter 
      .Fill(dsMetrics) 
      .Dispose() 
     End With 
     _sqlConn.Close() 
     _sqlConn.Dispose() 
    End Using 

    Return dsMetrics 
End Function 
関連する問題