在 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