我正在使用没有特定安全设置的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())
这给了我一个“在子报表中不支持”。例外。
请发布您用于身份验证的代码。 – craig 2013-04-29 13:34:26
添加类代码是一个好的开始。现在,'My.Settings.cnnString'看起来像什么?请不要“欺骗”它。如果你想混淆密码很好,但否则显示*完全*它看起来像。 – 2013-04-29 14:47:08
Provider = Microsoft.ACE.OLEDB.12.0; Data Source = | DataDirectory | \ App_Data \ FPC_Reporting.accdb 没有密码......就是这样。 – 2013-04-29 15:41:03