2013-04-26 75 views
1

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

///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文件的Page Footer中,以在报告的每个页面上显示。当我火了btnViewReport.Click方法,包含实际水晶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()) 

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

+0

请发布您用于身份验证的代码。 – craig 2013-04-29 13:34:26

+0

添加类代码是一个好的开始。现在,'My.Settings.cnnString'看起来像什么?请不要“欺骗”它。如果你想混淆密码很好,但否则显示*完全*它看起来像。 – 2013-04-29 14:47:08

+0

Provider = Microsoft.ACE.OLEDB.12.0; Data Source = | DataDirectory | \ App_Data \ FPC_Reporting.accdb 没有密码......就是这样。 – 2013-04-29 15:41:03

回答

0

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

1

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

+0

不幸的是,这个建议仍然给我登录失败。 – 2013-04-28 23:57:02

+0

另外,我的数据源是一个类对象,所以我不明白为什么Crystal Reports甚至会向数据库要求密码。 – 2013-04-29 00:16:40

+0

@ user1066133如果您的类对象包含连接字符串,请[编辑](http://stackoverflow.com/posts/16243953/edit)将其包含在内。 – 2013-04-29 12:07:55