在 Crystal 报告 VS2008 上导航到下一页时出现登录失败错误
Logon failed error when navigating to next page on Crystal Reports VS2008
我正在 Visual Studio 2008 年开发一个 crystal 报告,它使用几个不同的数据库作为数据源。一切正常,直到我尝试导航到第 2 页。有效的代码(因为结果有限)如下所示
Dim mssqlstr As String
mssqlstr = "SELECT TOP 1 t1.*, t2.column1, t2.column2 FROM
tablename1 As t1, tablename2 As t2 WHERE t1.ID = '" & txtID.Text & "'
AND t2.column2 = RTRIM(LEFT(t1.column_2, 2)) ORDER BY t1.ID DESC"
Dim DAms As New OleDbDataAdapter(mssqlstr, conn)
DAms.Fill(dsQRpt, "tablename")
'The code below is shared by the other subreport functions
QPrpt.Load(Server.MapPath("crreport.rpt"))
QPrpt.SetDataSource(dsQRpt)
crQtrProgress.ReportSource = QPrpt
crQtrProgress.RefreshReport()
但是当我需要这个查询的更大结果集时
mssqlstr = "SELECT column1, column2 FROM tablename ORDER BY ID DESC"
我收到错误
Logon failed.
Details: crdb_adoplus : Object reference not set to an instance of an object.
Error in File C:\Users\ALFRED~1.CAL\AppData\Local\Temp\rptQuarterlyProgress {10667888-35C5-41CA-93EF-214A64741965}.rpt: Unable to connect: incorrect log on parameters."
两个查询使用相同的连接字符串,并且报告字段来自数据表中的拖放字段 (.xsd)
我还应该提到,该报表使用了多个子报表,每个子报表来自不同的数据源。所有子报表的编码都相似并且工作正常,除非结果必须转移到下一页。如果我限制结果的数量,那么我会从每个子报表中获得所需的结果,但是如果数据转移到另一个页面......kaboom!我收到 "Unable to connect..." 错误。
DataSet 也连接到数据库并显示 table 数据没有问题。我一直在寻找解决方案,但没有找到符合我情况的任何东西。
感谢您提供的任何帮助
解决方案
感谢 haraman 提供了答案。这是工作代码
Dim dsQRpt = New Data.DataSet
Dim QPrpt = New ReportDocument
Protected Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Page.IsPostBack Then
If Session.Item("CRpt") IsNot Nothing Then
QPrpt = Session.Item("CRpt")
End If
crQtrProgress.ReportSource = QPrpt
crQtrProgress.RefreshReport()
Else
If Session.Item("CRpt") IsNot Nothing Then
Session.Remove("CRpt")
End If
Session.Add("CRpt", QPrpt)
End If
End Sub
Protected Sub btRunReport_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim mssqlstr As String
mssqlstr = "SELECT column1, column2 FROM tablename ORDER BY ID DESC"
Dim DAms As New OleDbDataAdapter(mssqlstr, conn)
DAms.Fill(dsQRpt, "tablename")
'Populate Report
QPrpt.Load(Server.MapPath("crreport.rpt"))
QPrpt.SetDataSource(dsQRpt)
crQtrProgress.ReportSource = QPrpt
Session.Add("CRpt", QPrpt)
End Sub
CrystalReportViewer 似乎丢失了 PostBack 上的 ReportDocument。您可以尝试将 ReportDocument 保存在会话中,然后在 PostBack 上将其重新分配给 PageLoad 事件中的 CrystalReportViewer,例如
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
QPrpt.Load(Server.MapPath("crreport.rpt"))
QPrpt.SetDataSource(dsQRpt)
If Page.IsPostBack Then
If Session.Item("CRpt") IsNot Nothing Then
QPrpt = Session.Item("CRpt")
End If
Else
If Session.Item("CRpt") IsNot Nothing Then
Session.Remove("CRpt")
End If
Session.Add("CRpt", QPrpt)
End If
crQtrProgress.ReportSource = QPrpt
crQtrProgress.RefreshReport()
End Sub
Protected Sub Page_Unload(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Unload
If Session.Item("CRpt") IsNot Nothing Then
Session.Remove("CRpt")
End If
Session.Add("CRpt", QPrpt)
End Sub
如果您在设置 LogOnInfo 时遇到具体问题,那么您也可以查看此 SO post Report asking for database login on setting DataTable as DataSource
我正在 Visual Studio 2008 年开发一个 crystal 报告,它使用几个不同的数据库作为数据源。一切正常,直到我尝试导航到第 2 页。有效的代码(因为结果有限)如下所示
Dim mssqlstr As String
mssqlstr = "SELECT TOP 1 t1.*, t2.column1, t2.column2 FROM
tablename1 As t1, tablename2 As t2 WHERE t1.ID = '" & txtID.Text & "'
AND t2.column2 = RTRIM(LEFT(t1.column_2, 2)) ORDER BY t1.ID DESC"
Dim DAms As New OleDbDataAdapter(mssqlstr, conn)
DAms.Fill(dsQRpt, "tablename")
'The code below is shared by the other subreport functions
QPrpt.Load(Server.MapPath("crreport.rpt"))
QPrpt.SetDataSource(dsQRpt)
crQtrProgress.ReportSource = QPrpt
crQtrProgress.RefreshReport()
但是当我需要这个查询的更大结果集时
mssqlstr = "SELECT column1, column2 FROM tablename ORDER BY ID DESC"
我收到错误
Logon failed.
Details: crdb_adoplus : Object reference not set to an instance of an object.
Error in File C:\Users\ALFRED~1.CAL\AppData\Local\Temp\rptQuarterlyProgress {10667888-35C5-41CA-93EF-214A64741965}.rpt: Unable to connect: incorrect log on parameters."
两个查询使用相同的连接字符串,并且报告字段来自数据表中的拖放字段 (.xsd)
我还应该提到,该报表使用了多个子报表,每个子报表来自不同的数据源。所有子报表的编码都相似并且工作正常,除非结果必须转移到下一页。如果我限制结果的数量,那么我会从每个子报表中获得所需的结果,但是如果数据转移到另一个页面......kaboom!我收到 "Unable to connect..." 错误。
DataSet 也连接到数据库并显示 table 数据没有问题。我一直在寻找解决方案,但没有找到符合我情况的任何东西。
感谢您提供的任何帮助
解决方案 感谢 haraman 提供了答案。这是工作代码
Dim dsQRpt = New Data.DataSet
Dim QPrpt = New ReportDocument
Protected Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Page.IsPostBack Then
If Session.Item("CRpt") IsNot Nothing Then
QPrpt = Session.Item("CRpt")
End If
crQtrProgress.ReportSource = QPrpt
crQtrProgress.RefreshReport()
Else
If Session.Item("CRpt") IsNot Nothing Then
Session.Remove("CRpt")
End If
Session.Add("CRpt", QPrpt)
End If
End Sub
Protected Sub btRunReport_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim mssqlstr As String
mssqlstr = "SELECT column1, column2 FROM tablename ORDER BY ID DESC"
Dim DAms As New OleDbDataAdapter(mssqlstr, conn)
DAms.Fill(dsQRpt, "tablename")
'Populate Report
QPrpt.Load(Server.MapPath("crreport.rpt"))
QPrpt.SetDataSource(dsQRpt)
crQtrProgress.ReportSource = QPrpt
Session.Add("CRpt", QPrpt)
End Sub
CrystalReportViewer 似乎丢失了 PostBack 上的 ReportDocument。您可以尝试将 ReportDocument 保存在会话中,然后在 PostBack 上将其重新分配给 PageLoad 事件中的 CrystalReportViewer,例如
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
QPrpt.Load(Server.MapPath("crreport.rpt"))
QPrpt.SetDataSource(dsQRpt)
If Page.IsPostBack Then
If Session.Item("CRpt") IsNot Nothing Then
QPrpt = Session.Item("CRpt")
End If
Else
If Session.Item("CRpt") IsNot Nothing Then
Session.Remove("CRpt")
End If
Session.Add("CRpt", QPrpt)
End If
crQtrProgress.ReportSource = QPrpt
crQtrProgress.RefreshReport()
End Sub
Protected Sub Page_Unload(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Unload
If Session.Item("CRpt") IsNot Nothing Then
Session.Remove("CRpt")
End If
Session.Add("CRpt", QPrpt)
End Sub
如果您在设置 LogOnInfo 时遇到具体问题,那么您也可以查看此 SO post Report asking for database login on setting DataTable as DataSource