直到今天,我始终能够将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(而不是存储过程),所以我可能甚至不接近这个但是它编译并基于我读到的内容似乎它“应该”起作用。
我做错了什么?
答案 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