Crystal Reports 要求数据库登录信息?

Posted

技术标签:

【中文标题】Crystal Reports 要求数据库登录信息?【英文标题】:Crystal Reports Asking For Database Login Information? 【发布时间】:2013-04-26 19:35:46 【问题描述】:

我正在使用没有特定安全设置的 Access 数据库。我可以通过资源管理器很好地打开数据库,但是当我尝试打开报告时,它会询问没有任何登录凭据。我注意到在“数据库登录”对话框中,有一个字段显示“服务器名称”,它是我在报告中使用的对象的命名空间和类名称。这是什么原因造成的?

///DAL Class
Option Strict On
Imports System.Data.OleDb
Imports FPCReportBuilder.Utilities
Namespace FPCReportBuilder.Data
    Public Class DAL
        Inherits DALCnn
        Public Shared Function GetDataTableUsingReader(ByVal sql As String, Optional ByVal parameterList As List(Of DataParameter) = Nothing, Optional ByVal type As CmdType = CmdType.StoredProcedure) As DataTable
            Dim cmd As OleDbCommand = CreateCommand(sql, parameterList, type)
            Dim dt As New DataTable
            Using cmd.Connection
                cmd.Connection.Open()
                dt.Load(cmd.ExecuteReader(CommandBehavior.CloseConnection))
            End Using
            Return dt
        End Function

        Private Shared Function CreateCommand(ByVal sql As String, Optional ByVal parameters As List(Of DataParameter) = Nothing, Optional ByVal type As CmdType = CmdType.StoredProcedure) As OleDbCommand
            Dim cmd As New OleDbCommand(sql, GetConnection())
            If type = CmdType.StoredProcedure Then
                cmd.CommandType = CommandType.StoredProcedure
            Else
                cmd.CommandType = CommandType.Text
            End If
            If Not parameters Is Nothing Then
                For Each parameter As DataParameter In parameters
                    Dim newParameter As OleDbParameter = cmd.CreateParameter()
                    newParameter.ParameterName = parameter.Name
                    newParameter.Value = parameter.Value
                    newParameter.OleDbType = parameter.DbType
                    newParameter.Direction = parameter.Direction
                    newParameter.Size = parameter.Size
                    cmd.Parameters.Add(newParameter)
                Next
            End If
            Return cmd
        End Function
    End Class
End Namespace

///DALCnn Class
Option Strict On
Imports System.Data.OleDb
Namespace FPCReportBuilder.Data
    Public MustInherit Class DALCnn
        Protected Friend Shared Function GetConnection() As OleDbConnection
            Return New OleDbConnection(My.Settings.cnnString)
        End Function
    End Class
End Namespace

当我通过代码运行它时,这一切都很好。当我调用像 ReportData.GetSection1Complete() 这样的类时,它是一个公共共享方法,它可以很好地恢复数据。

编辑*

我似乎有所进展。我已将 ReportDate 属性添加到 MainReport.rpt 文件的页脚,以显示在报告的每一页上。当我触发 btnViewReport.Click 方法(包含实际 Crystal ReportViewer 控件的 ReportViewer 表单)时,我会像这样填充数据源...

Private Sub btnViewReport_Click(sender As System.Object, e As System.EventArgs) Handles btnViewReport.Click
        Try
            Dim repViewer As New ReportViewer()
            Dim reportList As New List(Of Report)
            reportList.Add(objReport)
            repViewer.MainReport1.Database.Tables("Report").SetDataSource(reportList)
Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
End Sub

这似乎有效。但是 MainReport.rpt 包含一个 SubReport,其中也包含一个 SubReport。我试图从另一个名为 ReportData.GetSection1Complete() 的类中调用一个方法来填充 SubReport 中的数据,但我似乎无法弄清楚如何填充那个特定的 DataSource。我试过了……

repViewer.MainReport1.Subreports("Section1.rpt").Subreports("Section1Complete.rpt").Database.Tables("ReportData").SetDataSource(ReportData.GetSection1Complete())

这给了我一个“子报表不支持”。例外。

【问题讨论】:

请发布您用于身份验证的代码。 添加类代码是一个好的开始。现在,My.Settings.cnnString 看起来像什么?请不要“捏造”它。如果您想对密码进行模糊处理,但要准确地向我们展示它的样子。 Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\App_Data\FPC_Reporting.accdb 没有密码...就是这样。 【参考方案1】:

当您使用 Access 打开未配置用户级安全性的数据库时,您将自动(并且以静默方式)以用户 Admin 的身份登录。当 Crystal Reports 提示您输入凭据时,请尝试使用用户名 Admin 和空密码。如果可行,请查看 Crystal Reports 是否提供“保存密码”或“保存登录信息”或类似的选项。

【讨论】:

不幸的是,这个建议仍然让我登录失败。 另外,我的数据源是一个类对象,所以我不明白水晶报表为什么会要求输入数据库密码。 @user1066133 如果你的类对象包含一个连接字符串,那么edit你的问题要包括它。 类没有。该类连接到另一个类,该类连接到另一个保存连接信息的类。【参考方案2】:

不知道我被要求登录的确切原因,但我发现如果我不事先填充对象数据源,它就会这样做。当我在加载报表查看器的按钮上填充数据源时,它不会要求登录。我遇到的另一个问题是,当我在子报表中有子报表时,它不会显示。经过更多研究后,我发现子报表中不能有子报表,因此当我解封报表时,数据现在显示得很好。感谢大家的帮助。

【讨论】:

以上是关于Crystal Reports 要求数据库登录信息?的主要内容,如果未能解决你的问题,请参考以下文章

数据库登录失败:Crystal Reports

配置 Crystal Reports 所需的帮助

.Net Crystal Reports 13 可以使用应用程序池身份登录 SQL Server 吗?

Crystal Reports (C#):信息显示不正确

Crystal Reports 不会显示相关的表格数据

Crystal Reports 2013:页眉公式字段不一致