我正在使用没有特定安全设置的 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())
这给了我一个“子报表不支持”。例外。