Asp.net Crystal报表数据库连接未处理
我在asp.net web应用程序中使用Visual Studio 2013,并大量使用Crystal Reports。我的数据库是SQL Server(使用AWS RDS)。一切都很顺利。唯一的问题是,从数据库方面看,即使在关闭浏览器窗口之后,Crystal Report连接也没有关闭/处理。它会不断增加连接的数量 这是我的代码:Asp.net Crystal报表数据库连接未处理,asp.net,sql-server,crystal-reports,odbc,database-connection,Asp.net,Sql Server,Crystal Reports,Odbc,Database Connection,我在asp.net web应用程序中使用Visual Studio 2013,并大量使用Crystal Reports。我的数据库是SQL Server(使用AWS RDS)。一切都很顺利。唯一的问题是,从数据库方面看,即使在关闭浏览器窗口之后,Crystal Report连接也没有关闭/处理。它会不断增加连接的数量 这是我的代码: ReportDocument cryRpt = new ReportDocument(); ParameterFields paramFields = new P
ReportDocument cryRpt = new ReportDocument();
ParameterFields paramFields = new ParameterFields();
ParameterField paramField = new ParameterField();
cryRpt.Load(Server.MapPath("~/Reports/Report001.rpt"));
String host = System.Configuration.ConfigurationManager.AppSettings["SqlServer"];
String database = System.Configuration.ConfigurationManager.AppSettings["SqlDatabase"];
String user = System.Configuration.ConfigurationManager.AppSettings["SqlUsername"];
String password = System.Configuration.ConfigurationManager.AppSettings["SqlPassword"];
var connectionInfo = new ConnectionInfo
{
Type = ConnectionInfoType.SQL,
ServerName = host,
DatabaseName = database
};
connectionInfo.IntegratedSecurity = false;
connectionInfo.UserID = user;
connectionInfo.Password = password;
TableLogOnInfo newLogonInfo = null;
foreach (CrystalDecisions.CrystalReports.Engine.Table currentTable in cryRpt.Database.Tables)
{
newLogonInfo = currentTable.LogOnInfo;
newLogonInfo.ConnectionInfo = connectionInfo;
currentTable.ApplyLogOnInfo(newLogonInfo);
}
ParameterField pReportName = new ParameterField();
pReportName.ParameterFieldName = "REPONAME";
ParameterDiscreteValue dcpReportName = new ParameterDiscreteValue();
dcpReportName.Value = "REPORT";
pReportName.CurrentValues.Add(dcpReportName);
paramFields.Add(pReportName);
CrystalReportViewer1.ParameterFieldInfo = paramFields;
CrystalReportViewer1.Zoom(100);
CrystalReportViewer1.PrintMode = CrystalDecisions.Web.PrintMode.ActiveX;
CrystalReportViewer1.ReportSource = cryRpt;
CrystalReportViewer1.ReuseParameterValuesOnRefresh = true;
CrystalReportViewer1.ShowFirstPage();
// Disposing the report
foreach (CrystalDecisions.CrystalReports.Engine.Table currentTable in cryRpt.Database.Tables)
{
currentTable.Dispose();
}
CrystalReportViewer1.ReportSource = null;
cryRpt.Database.Dispose();
cryRpt.Close();
cryRpt.Dispose();
cryRpt = (ReportDocument)CrystalReportViewer1.ReportSource;
CrystalReportViewer1.Dispose();
connectionInfo.Attributes.Collection.Clear();
GC.Collect();
尝试使用卸载方法也像这样。但是没有运气
protected void CrystalReportViewer1_Unload(object sender, EventArgs e)
{
cryRpt.Close();
cryRpt.Dispose();
CrystalReportViewer1.Dispose();
}
作为一个临时解决方案,我将使用存储过程从数据库手动终止休眠数据库连接
我正在使用ODBC连接获取数据。ODBC凭据存储在配置文件中,并按如下方式检索
String host = System.Configuration.ConfigurationManager.AppSettings["SqlServer"];
String database = System.Configuration.ConfigurationManager.AppSettings["SqlDatabase"];
String user = System.Configuration.ConfigurationManager.AppSettings["SqlUsername"];
String password = System.Configuration.ConfigurationManager.AppSettings["SqlPassword"];
请帮助我解决这个问题。在您上面的代码中,您如何确切地使用存储在配置文件中的ODBC连接?例如[它是数据集吗?],因为,如果是的话!然后,在加载报告之前,请关闭数据库连接,如下所示:
cryRpt.Load(Server.MapPath("~/Reports/Report001.rpt"));
我认为您的问题在于数据库与应用程序的连接本身,而不是与Crystal Reports组件的连接。
尝试关闭连接。在处理查看器之前关闭CrystalReportViewer1.Dispose(),但请注意:
不要对连接、数据读取器或任何
类的Finalize方法中的其他托管对象。在一个
在终结器中,您应该只释放类需要的非托管资源
直接拥有。如果您的类不拥有任何非托管资源,请执行以下操作:
不要在类定义中包含Finalize方法。更多
有关详细信息,请参阅垃圾收集。
另外,您的情况是自然的,因为客户端保持连接打开
以下是我使用的代码示例(没有ODBC和MS Access):
Imports CrystalDecisions.CrystalReports.Engine
Imports System.Data.OleDb
Imports CrystalDecisions.Shared
Public Class CrystalForm
Dim cryRpt As New ReportDocument
Dim crtableLogoninfos As New TableLogOnInfos
Dim crtableLogoninfo As New TableLogOnInfo
Dim crConnectionInfo As New ConnectionInfo
Dim CrTables As Tables
Dim CrTable As Table
Private Sub CrystalForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim CMDSelect As String = ("SELECT * FROM Table_Name")
Try
Using DT As New DataTable
Using CN As New OleDbConnection With {.ConnectionString = GetBuilderCNString()}
CN.Open()
Using DataAdapt As New OleDbDataAdapter(CMDSelect, CN)
DataAdapt.Fill(DT)
End Using
End Using
cryRpt.Load(IO.Path.Combine(Application.StartupPath, "Crystal_Report.rpt"))
AssignConnection(cryRpt)
cryRpt.SetDataSource(DT)
CrystalReportViewer1.ReportSource = cryRpt
End Using
Catch ex As EngineException
MsgBox("Report Load Error : " & ex.Message)
End Try
End Sub
Private Sub AssignConnection(rpt As ReportDocument)
Try
Dim ThisConnection As New ConnectionInfo()
With ThisConnection
.DatabaseName = ""
.ServerName = ""
.UserID = "admin"
.Password = "MyPassWord"
End With
For Each table As Table In rpt.Database.Tables
AssignTableConnection(table, ThisConnection)
Next
For Each section As Section In rpt.ReportDefinition.Sections
For Each reportObject As ReportObject In section.ReportObjects
If reportObject.Kind = ReportObjectKind.SubreportObject Then
Dim subReport As SubreportObject = DirectCast(reportObject, SubreportObject)
Dim subDocument As ReportDocument = subReport.OpenSubreport(subReport.SubreportName)
For Each table As Table In subDocument.Database.Tables
AssignTableConnection(table, ThisConnection)
Next
subDocument.SetDatabaseLogon(ThisConnection.UserID,
ThisConnection.Password,
ThisConnection.ServerName,
ThisConnection.DatabaseName)
End If
Next
Next
rpt.SetDatabaseLogon(ThisConnection.UserID,
ThisConnection.Password,
ThisConnection.ServerName,
ThisConnection.DatabaseName)
Catch ex As EngineException
MsgBox("Load Report Error : " & ex.Message)
End Try
End Sub
Private Sub AssignTableConnection(ByVal table As Table, ByVal connection As ConnectionInfo)
Try
Dim logOnInfo As TableLogOnInfo = table.LogOnInfo
connection.Type = logOnInfo.ConnectionInfo.Type
logOnInfo.ConnectionInfo = connection
With table.LogOnInfo.ConnectionInfo
.DatabaseName = connection.DatabaseName
.ServerName = connection.ServerName
.UserID = connection.UserID
.Password = connection.Password
.Type = connection.Type
End With
table.ApplyLogOnInfo(logOnInfo)
Catch ex As EngineException
MsgBox("Load Table Error : " & ex.Message)
End Try
End Sub
End Class