Динамическое изменение строки подключения MySQL к Crystal Reports

#mysql #vb.net #crystal-reports #connection-string

#mysql #vb.net #crystal-отчеты #строка подключения

Вопрос:

Я использую CrystalReportViewer и CrystalReportSource для загрузки и отображения файла .rpt в моем приложении.

Ситуация, с которой я столкнулся, такова:

Допустим, человек создал отчет Crystal Reports вне моего приложения и установил для его источника данных значение database. Затем я использую этот rpt-файл в своем приложении, но мне нужно привязать его к другой базе данных (идентичной исходной с точки зрения структуры таблицы и имен столбцов, но с другой строкой подключения, именем пользователя и паролем).

Как мне это сделать в VB.NET код?

В настоящее время я загружаю отчет с помощью:

 Public Function SetReportSource(ByVal RptFile As String) As ReportDocument

    Try
        Dim crtableLogoninfo As New TableLogOnInfo()
        Dim crConnectionInfo As New ConnectionInfo()
        Dim CrTables As Tables
        Dim CrTable As Table

        If System.IO.File.Exists(RptFile) Then
            Dim crReportDocument As New ReportDocument()
            crReportDocument.Load(RptFile)

            With crConnectionInfo
                .ServerName = "DRIVER={MySQL ODBC 5.1 Driver};SERVER=localhost;Port=3306;UID=root;"
                .DatabaseName = gDatabaseName
                .UserID = gServerUser
                .Password = gServerPassword
            End With

            CrTables = crReportDocument.Database.Tables
            For Each CrTable In CrTables
                CrTable.ApplyLogOnInfo(crtableLogoninfo)
                CrTable.LogOnInfo.ConnectionInfo.ServerName = crConnectionInfo.ServerName
                CrTable.LogOnInfo.ConnectionInfo.DatabaseName = crConnectionInfo.DatabaseName
                CrTable.LogOnInfo.ConnectionInfo.UserID = crConnectionInfo.UserID
                CrTable.LogOnInfo.ConnectionInfo.Password = crConnectionInfo.Password
                'Apply the schema name to the table's location
                CrTable.Location = gDatabaseName amp; "." amp; CrTable.Location
            Next

            crReportDocument.VerifyDatabase()
            SetReportSource = crReportDocument
        Else
            MsgBox("Report file not found...", MsgBoxStyle.Critical, proTitleMsg)
        End If
    Catch ex As Exception
        System.Windows.Forms.MessageBox.Show("Error Found..." amp; vbCrLf amp; "Error No : " amp; Err.Number amp; vbCrLf amp; "Description :" amp; Err.Description amp; vbCrLf amp; vbCrLf amp; "Line no : " amp; Err.Erl amp; vbCrLf amp; "Procedure name : SetReportSource" amp; vbCrLf amp; "Module name : GeneralFunctions", proTitleMsg)
    End Try

End Function
  

Ответ №1:

Вот как я это сделал. Я использовал Oracle с ODBC на ASP.NET но вы должны быть в состоянии сделать то же самое с MySQL и ODBC:

В рамках обновления устаревшего приложения, которое я выполнял, я решил перенести Crystal Reports в веб-приложение, а не предоставлять пользователям прямой доступ к ним в Crystal Reports XI через Citrix, который был методом, который они использовали. Это имеет несколько преимуществ, основным из которых является скорость. Одна из проблем, которая мучила меня, заключалась в том, как изменить информацию для входа во время выполнения, чтобы приложение автоматически указывало на правильную базу данных Oracle (для разработки, тестирования или производства) на основе того, с какого сервера осуществлялся доступ к отчету.

Решение, которое я нашел, состояло в том, чтобы настроить подключение к базе данных Oracle как DSN в ODBC и подключиться к DSN ODBC, а не напрямую использовать клиент Oracle. Это не единственный способ сделать это, но, похоже, это лучший способ для моих целей.

В файле с исходным кодом для страницы, содержащей средство просмотра Crystal Reports, я поместил следующий код, который обрабатывает то же событие, которое отображает средство просмотра.

 Protected Sub btnGenerate_Click(sender As Object, e As System.EventArgs) Handles btnGenerate.Click
Dim connInfo As New ConnectionInfo
Dim rptDoc As New ReportDocument

' setup the connection
With connInfo
.ServerName = "oracledsn" ' ODBC DSN in quotes, not Oracle server or database name
.DatabaseName = "" ' leave empty string here
.UserID = "username" ' database user ID in quotes
.Password = "password"  'database password in quotes
End With

' load the Crystal Report
rptDoc.Load(Server.MapPath(Utilities.AppSettingsFunction.getValue("ReportFolder") amp; ddlReports.SelectedValue))

' add required parameters
If pnlstartdates.Visible Then
rptDoc.SetParameterValue("REPORT_DATE", txtSingleDate.Text)
End If

' apply logon information

For Each tbl As CrystalDecisions.CrystalReports.Engine.Table In rptDoc.Database.Tables
Dim repTblLogonInfo As TableLogOnInfo = tbl.LogOnInfo
repTblLogonInfo.ConnectionInfo = connInfo
tbl.ApplyLogOnInfo(repTblLogonInfo)
Next

' Set, bind, and display Crystal Reports Viewer data source
Session("rptDoc") = rptDoc
Me.CrystalReportViewer1.ReportSource = Session("rptDoc")
CrystalReportViewer1.DataBind()
UpdatePanel1.Update()
 End Sub
  

Приведенную выше информацию для входа в систему можно легко сохранить в web.config вместо ее жесткого кодирования, как указано выше.

Кстати, я решил поместить средство просмотра Crystal Reports в ASP.NET Панель обновления AJAX, именно поэтому ReportSource средства просмотра хранится в переменной сеанса. Если вы решите сделать это, средство просмотра должно быть привязано к данным в событии Init (не в событии Load), чтобы отображаться должным образом.

 Protected Sub Page_Init(sender As Object, e As System.EventArgs) Handles Me.Init
If Not Page.IsPostBack Then
txtSingleDate.Text = Now.Date()
ElseIf Session("rptDoc") IsNot Nothing Then
Me.CrystalReportViewer1.ReportSource = Session("rptDoc")
CrystalReportViewer1.DataBind()
UpdatePanel1.Update()
End If
 End Sub