【问题标题】:How do I fill and filter a dataset for a Crystal Report that comes from a Stored Procedure如何为来自存储过程的 Crystal Report 填充和过滤数据集
【发布时间】:2014-12-17 06:20:16
【问题描述】:

直到今天,我一直能够将 Crystal Reports 直接连接到数据库,而且我从来没有遇到过这样的问题。但是,我现在处于必须基于数据集构建报告的位置。我查看了 SO 的几个教程和其他帖子,但都做了一些略有不同的事情。我认为我所拥有的非常接近,但我错过了一些重要的步骤,因为我没有得到任何数据来显示在我的报告中。这是我到目前为止的代码。

Private Sub RunProductReport(ByVal startDate As String, ByVal endDate As String, ByVal spName As String)
    Dim proReportCon As String = My.Settings.eocon
    Dim da As New SqlDataAdapter(spName, proReportCon)
    da.SelectCommand.CommandType = CommandType.StoredProcedure
    da.SelectCommand.Parameters.AddWithValue("@StartDate", Convert.ToString(startDate))
    da.SelectCommand.Parameters.AddWithValue("@EndDate", Convert.ToString(endDate))

    da.TableMappings.Add("Table", "Tickets")

    Dim ds As New dsProductReport
    da.Fill(ds)

    aReport = New ProductivityReport
    aReport.SetDataSource(ds)

    crvReport.ReportSource = aReport
End Sub

我已经创建了一个数据集,并且可以从设计器中查看报表中的数据(尽管我没有被要求提供参数,所以我在数据库中获取了所有内容)。报告确实在我的应用程序中打开,但在运行时它是空白的,所以我认为我没有用新数据填充数据集。我有 da.Fill(ds),我认为它应该填充 DataSet,但事实并非如此,我不知道为什么。

正如我提到的,我的参数被忽略了——我发现的大多数示例代码都使用了 Select Statements inline(而不是存储过程),所以我什至可能不会接近这个,但它会根据我阅读的内容进行编译似乎它“应该”工作。

我做错了什么?

【问题讨论】:

  • 所以你在da.Fill(ds)之后放了一个断点,你的数据集是空的?
  • 试试aReport.SetDataSource(ds.Tables(0))
  • 我确实尝试过断点。它说有两条记录,但我永远看不到数据。但是我不确定它是否不存在,或者我只是没有走在当地树中的正确路径上。我不断打开节点,一遍又一遍地看到相同类型的数据。
  • 我按照您的建议设置了数据源,但我仍然在报告中一无所获。所以我认为数据永远不会进入数据集。我承认我对调试器的了解并不多,但是如果我足够多地探索,我通常可以找到我的数据。我没有找到它,所以我认为它不存在。我的设置有什么明显错误吗?
  • 我有一个工作函数可以将数据从 SP 获取到 DataSet。让我找到它,以便您查看哪个部分失败(sp、报告或两者)

标签: vb.net stored-procedures crystal-reports dataset


【解决方案1】:

好的,这个函数返回一个数据集,其中包含来自 SP 或原始查询的数据。

Public Function getDataSet(ByVal query As String, ByVal isStoredProcedure As Boolean, ParamArray Params() As SqlParameter) As DataSet
    Dim sqlCmd As New SqlCommand
    Dim dataAdapter As New SqlDataAdapter
    Dim dataSet As DataSet = New DataSet

    Try
        If isStoredProcedure Then sqlCmd.CommandType = CommandType.StoredProcedure
        sqlCmd.CommandText = query
        For Each sp As SqlParameter In Params
            sqlCmd.Parameters.AddWithValue(sp.ParameterName, sp.Value)
        Next
        sqlCmd.Connection = New SqlConnection(MyConnectionString)
        dataAdapter.SelectCommand = sqlCmd
        dataAdapter.Fill(dataSet, "Table")
        sqlCmd.Connection.Close()
        return dataSet
    Catch ex As Exception
        If sqlCmd.Connection.State = ConnectionState.Open Then sqlCmd.Connection.Close()
    End Try

    Return False
End Function

你可以这样称呼它:

 Dim ds As DataSet = getDataSet("MySP or Query", True, New SqlClient.SqlParameter("@MyParam", MyParamVaue))

就这样

aReport = New ProductivityReport
aReport.SetDataSource(ds.Tables(0))

crvReport.ReportSource = aReport

【讨论】:

    猜你喜欢
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2016-08-03
    相关资源
    最近更新 更多