当我使用DSN
作为数据源时,我有水晶报告正常工作。
问题是我现在正在使用数据集。数据集包含我需要的所有表,并使用存储过程从数据库填充数据。
但是,通过这种方式,它会抛出一个错误:“Missing Parameters
”。
我正在做如下:
第1步:创建Dataset1.xsd
并使用data connections
从数据库中插入所有必需的tables
。
第2步:让data source
使用database expert
作为Dataset1.xsd
报告
第3步:使用数据集中的存储过程填充数据,然后创建Dataset1
的实例并将数据集中的数据合并到Dataset 1
实例。
我的代码从数据库中获取数据,然后将其合并到Dataset1
实例,并将其作为源文件提供给crystal报告如下:
Private Sub ReportByDataset(ByVal rptDoc As CrystalDecisions.CrystalReports.Engine.ReportDocument)
'new code
Dim myConnection As New SqlClient.SqlConnection()
'myConnection.ConnectionString = "server= (local)\NetSDK;database=pubs;Trusted_Connection=yes"
Dim ds As New DataSet1
myConnection.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings("HighriseContractingWebConnectionString").ConnectionString
myConnection.Open()
Dim MyCommand As New SqlClient.SqlCommand()
MyCommand.Connection = myConnection
MyCommand.CommandText = "SP_Web_GetReportTables"
MyCommand.CommandType = CommandType.StoredProcedure
Dim MyDA As New SqlClient.SqlDataAdapter()
MyDA.SelectCommand = MyCommand
Dim myDS As New DataSet
MyDA.Fill(myDS)
myConnection.Close()
ds.Tables("RABill_RPT").Merge(myDS.Tables(0), MissingSchemaAction.Ignore)
myDS.Tables(0).Reset()
ds.Tables("RA_bills").Merge(myDS.Tables(1), MissingSchemaAction.Ignore)
ds.Tables("Work_Completion").Merge(myDS.Tables(2), MissingSchemaAction.Ignore)
ds.Tables("contractor").Merge(myDS.Tables(3), MissingSchemaAction.Ignore)
ds.Tables("WO_Header").Merge(myDS.Tables(4), MissingSchemaAction.Ignore)
ds.Tables("Project").Merge(myDS.Tables(5), MissingSchemaAction.Ignore)
ds.Tables("contractor_1").Merge(myDS.Tables(6), MissingSchemaAction.Ignore)
ds.Tables("Users").Merge(myDS.Tables(7), MissingSchemaAction.Ignore)
ds.Tables("Users_Approved").Merge(myDS.Tables(8), MissingSchemaAction.Ignore)
ds.Tables("voucher").Merge(myDS.Tables(9), MissingSchemaAction.Ignore)
ds.Tables("Employee_Approve").Merge(myDS.Tables(10), MissingSchemaAction.Ignore)
ds.Tables("Employee").Merge(myDS.Tables(11), MissingSchemaAction.Ignore)
ds.Tables("Account").Merge(myDS.Tables(12), MissingSchemaAction.Ignore)
ds.Tables("TDS").Merge(myDS.Tables(13), MissingSchemaAction.Ignore)
ds.Tables("WO_Detail").Merge(myDS.Tables(14), MissingSchemaAction.Ignore)
ds.Tables("V_WO_BlockTaskNo").Merge(myDS.Tables(15), MissingSchemaAction.Ignore)
ds.Tables("TASK").Merge(myDS.Tables(16), MissingSchemaAction.Ignore)
ds.Tables("Cont_Voucher").Merge(myDS.Tables(17), MissingSchemaAction.Ignore)
ds.Tables("Cont_Voucher_1").Merge(myDS.Tables(17), MissingSchemaAction.Ignore)
ds.Tables("Cont_Voucher_2").Merge(myDS.Tables(17), MissingSchemaAction.Ignore)
ds.Tables("Company").Merge(myDS.Tables(18), MissingSchemaAction.Ignore)
''new code ends
rptDoc.SetDataSource(ds)
CRReport.HasCrystalLogo = False
CRReport.HasToggleGroupTreeButton = False
CRReport.ReportSource = rptDoc
CRReport.DataBind()
End Sub
但它不起作用,我错过了什么。同样的工作正常使用DSN
这不是参数的问题,同样在其他方面工作正常
注意:我知道上面的代码不是内存优化的,但我现在关心的是以某种方式让它工作,我可以稍后优化它
下图显示数据集1为数据源
答案 0 :(得分:0)
两种可能性 - 你在哪里得到参数丢失错误抛出?如果它位于存储过程SP_Web_GetReportTables上,则不会在MyCommand上为该sproc添加任何参数。如果它位于报告本身上,请检查报告本身侧面的字段资源管理器,并查看是否有任何已定义的参数,这些参数是使用DSN遗留的。由于您现在直接传入数据集,因此无需传入任何参数。最后,如果使用Crystal Report Viewer,只需设置ReportSource即可显示它,我不确定DataBind正在做什么你。
答案 1 :(得分:0)
如果您创建新数据源并删除旧数据源,CR也会删除与该数据源的查询参数相关的参数。最好更改数据源。