0

我正在使用 ASP.NET。我有一个 ReportPage1 和 ReportOutputPage1。这些是不同的 aspx 文件,并且具有不同的 MasterPages。但是,我需要在两个页面上使用相同的 SqlDataSource 对象。在 ReportPage 上我需要 SqlDataSource 来调用 StoredProcedure 并将数据导入 CSV 文件,但在 ReportOutputPage 上我需要使用 SqlDataSource 来调用相同的 StoredProcedure 并填充 GridView。

ReportPage1 是“主”页面 - 从该页面单击按钮会打开 ReportOutputPage1 并将其显示在新窗口中。ReportPage 是ReportOutputPage1 的PreviousPage

以上是 Report1 的示例。Report2(带有 SqlDataSource2)和 Report3(SqlDataSource3)等的想法相同 - 10 个不同的报告。

如何为每两个页面(ReportPage & ReportOutputPage)重用SqlDataSource?

  1. 我在网络上找到的第一个建议 - 对 ReportPage 和 ReportOutputPage 都使用母版页。这不起作用,因为我已经为 ReportPage 和 ReportOutputPage 提供了不同的母版页,然后我需要为每个报告创建 10 个不同的 MasterPages。

  2. 第二个建议是在 ReportPage 上定义 SqlDataSource,然后在 ReportOutputPage 上使用 PrevousePage 重用它,但这不适用于我的特殊情况(我正在使用 Ajax 人员和部分页面回发,并且丢失了 PreviousPage,SqlDataSource 也无法序列化为将其保存在 ViewState 或类似文件中)。

  3. 创建用户控件。可能这可以工作,但每次为新报告创建 UserControl 非常耗时(10 个报告 - 10 个用户控件?)。

  4. 简单地复制和粘贴 SqlDataSource(我为一份报告做了)可以工作,但我想要更像代码重用的东西。如有必要,有人可能会忘记在两个不同的地方修改 SqlDataSource。

能否请您给我一些建议如何重用报告和报告输出页面的代码(特别是 SqlDataSource)?

4

1 回答 1

2

你能定义使用相同的需求SqlDataSource吗?如果它们是两个不同的页面,并且听起来像是两种不同的用途,为什么不使用两个不同的SqlDataSource?无论如何,这些页面是分开的,您将无法与另一个共享对象。

我建议您考虑在应用程序中添加一个数据层以进行数据库交互,并在请求时将您的数据绑定到数据网格。这样,您只需构建一次数据库交互,并在不同的页面上重用它。

另一种选择是您只需使用两个SqlDataSources 并将它们复制/粘贴到两个页面。如果您尝试进行选择或某种标准适用于您的第二页,那么请考虑QueryStringParameter在您的SqlDataSource.

希望这可以帮助。

编辑:在 App_Code 某处弹出这个,传入您的特定使用要求。

Public Shared Function GetData(connString As String, command As String, Optional params As SqlParameter() = Nothing) As DataTable
    Dim conn As New SqlConnection(connString)
    Dim da As New SqlDataAdapter(command, conn)
    Dim dt As New DataTable
    da.SelectCommand.CommandType = CommandType.StoredProcedure
    da.SelectCommand.CommandTimeout = 6000 '6 seconds.
    If Not IsNothing(params) Then
        For Each p As SqlParameter In params
            da.SelectCommand.Parameters.Add(p)
        Next
    End If
    Try
        conn.Open()
        da.Fill(dt)
        Return dt
    Catch ex As Exception
        Throw ex
    Finally
        conn.Close()
    End Try
End Function

然后将数据表绑定到您的gridview,不确定您如何输出到文件。

Private Sub BindData(gridview As GridView, data As DataTable)
    gridview.DataSource = data
End Sub

您现在可以从后面的代码中重用数据库交互:

Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
   BindData(MyGridView,GetData(ConnectionStrings(connName).ConnectionString, _
                 "dbo.SomeSprocOrOther", _
                 New SqlParameter(){New SqlParameter("paramName","paramValue")})
End Sub
于 2012-10-01T12:36:07.773 回答