Вот как я это сделал.Я использовал Oracle с ODBC на ASP.NET, но вы должны быть в состоянии сделать то же самое с MySQL и ODBC:
В рамках обновления устаревших приложений, которое я делал, я решил переместить CrystalСообщает в веб-приложение о том, что пользователи получают к ним доступ непосредственно в Crystal Reports XI через Citrix, и этот метод используется ими.Это имеет несколько преимуществ, основным из которых является скорость.Одна проблема, которая меня беспокоила, заключалась в том, как изменить информацию для входа во время выполнения, чтобы приложение автоматически указывало на правильную базу данных Oracle (разработку, тестирование или производство) в зависимости от того, с какого сервера был получен доступ к отчету.
Решение, которое я нашел, состояло в том, чтобы установить соединение с базой данных Oracle как DSN в ODBC и подключиться к DSN ODBC, а не напрямую использовать клиент Oracle.Это не единственный способ сделать это, но, похоже, это лучший способ для моих целей.
В файле с выделенным кодом для страницы, содержащей Crystal Reports Viewer, я поместил следующий код, которыйобрабатывает то же событие, которое визуализирует зрителя.
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") & 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 Viewer на панель обновления ASP.NET AJAX, поэтому ReportSource этого средства просмотра хранится в переменной Session.Если вы решите сделать это, зритель должен быть привязан к базе данных в событии 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