SqlDataSource在不同页面上重用

时间:2012-10-01 12:09:31

标签: asp.net code-reuse

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

ReportPage1是“主要”页面 - 从该页面单击按钮打开ReportOutputPage1并在新窗口中显示它。 ReportPage是 PreviousPage ,用于ReportOutputPage1。

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

如何每两页重用一次SqlDataSource(ReportPage& ReportOutputPage)?

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

  2. 第二个建议是在ReportPage上定义SqlDataSource,然后在ReportOutputPage上使用PrevousePage重用它,但这对我的特殊情况不起作用(我使用的是Ajax人员和部分页面回发,我也在丢失PreviousPage,无法将SqlDataSource序列化以将其保存在ViewState或类似内容中。

  3. 创建UserControl。可能这可行,但每次为新报告创建UserControl都是耗时的(10个报告--10个用户控制?)。

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

  5. 请你给我一些建议如何重用代码(特别是SqlDataSource)来报告& ReportOutput页面?

1 个答案:

答案 0 :(得分:2)

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

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

另一种选择是您只需使用两个SqlDataSource并将它们复制/粘贴到这两个页面。如果您尝试进行选择或某种条件适用于您的第二页,请考虑在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