如何填充和过滤来自存储过程的Crystal Report的数据集

时间:2014-10-21 21:24:49

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

直到今天,我始终能够将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

我创建了一个DataSet,可以从设计器中查看报告中的数据(虽然我没有要求参数,所以我得到了数据库中的所有内容)。报告在我的应用程序中打开,但在运行时它是空白的,所以我认为我没有用新数据填充数据集。我有da.Fill(ds),我认为它应该填充DataSet但它不是,我不知道为什么。

正如我所提到的,我的参数被忽略了 - 我发现的大部分示例代码都使用了Select Statements inline(而不是存储过程),所以我可能甚至不接近这个但是它编译并基于我读到的内容似乎它“应该”起作用。

我做错了什么?

1 个答案:

答案 0 :(得分: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