【问题标题】:Stored Procedure Returns Multiple Recordsets存储过程返回多个记录集
【发布时间】:2009-06-16 17:07:55
【问题描述】:

我对 c# 很陌生。 我有一个需要多个记录集的页面,以及一个返回它们的存储过程。我正在对主记录集使用中继器控件。如何进入下一个返回的记录集?


好的,所以数据源在 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>

【问题讨论】:

    标签: c# web-applications multiple-resultsets


    【解决方案1】:

    在阅读器上调用 NextResult() 方法以移动到下一个结果。

    不,您不能使用 SqlDataSource 执行此操作,您需要使用代码隐藏或将过程分解为单独的查询。

    【讨论】:

    • 大声笑。实际上,我什至不得不查找它,因为我已经很久没有亲身接触过 DataReader 了。
    • 感谢您为我指明正确的方向。由于我的经验不足,希望您能详细说明一下。
    • 真的没有更多的东西——当你想要下一个结果集时,只需在你的阅读器对象上调用 NextResult() 方法。也许如果您可以发布一些代码来显示您正在尝试连接的内容,那么有人可以给您一些指示。
    • 我编辑了问题并添加了代码。我希望它能澄清我所缺少的这个难题。提前致谢。
    • 这么简单的解决方案,我花了好几个小时才弄明白...非常感谢!
    【解决方案2】:

    感谢大家的回答。如果您在创建拖放控件时进行了很多更改,NextResult() 就可以很好地工作。他们来了。

    1. 从 aspx 页面中删除数据源
    2. 从 Repeater 控件中删除 DataSourceID 属性
    3. 在您的代码隐藏中创建一个返回数据读取器对象的函数。例如 AstMgtDr()
    4. 在您的页面加载中,为 Repeater 控件设置数据源和数据绑定属性

      Repeater1.DataSource = AstMgtDr();

      Repeater1.DataBind();

    5. 在您的 aspx 页面顶部,添加一个页面级指令以使用“System.Data.Common” 命名空间 &lt;%@ Import namespace="System.Data.Common" %&gt;

    6. 显示您的数据:

    这是最好的方法 性能,但它需要明确 打字

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

    这是另一种使用字段的方法 名称 - 比 以前的方法,但比默认的 Eval 更快。

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

    希望这可以节省其他人一些时间。

    【讨论】:

      【解决方案3】:

      这个问题已经看过很多次了,我只是想提交我自己的解决方案。
      我知道最初的问题是 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
      

      【讨论】:

        猜你喜欢
        • 2014-01-04
        • 2010-11-28
        • 2013-09-01
        • 2017-05-06
        • 2021-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多