我有一组当前代码,用于通过服务器连接加载 C# 中的 Crystal 报表。
以下是加载报告的代码:
CrystalReportViewer1.ParameterFieldInfo.Clear();
string reportName = Request.QueryString["rpt"];
if (reportName != null)
{
crystalReport = new ReportDocument();
crystalReport.Load(@"\\esco-iis\crystalreports\purchasing\po.rpt");
//crystalReport.Load(@"\\esco\crystalreports\purchasing\po.rpt");
var connectionInfo = new ConnectionInfo();
connectionInfo.ServerName = "server";
connectionInfo.DatabaseName = "database";
connectionInfo.Password = "pass";
connectionInfo.UserID = "user";
connectionInfo.IntegratedSecurity = false;
crystalReport.SetDatabaseLogon("user", "pass", "server", "database");
Tables CrTables = crystalReport.Database.Tables;
TableLogOnInfo crtableLogoninfo = new TableLogOnInfo();
foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in CrTables)
{
crtableLogoninfo = CrTable.LogOnInfo;
crtableLogoninfo.ConnectionInfo = connectionInfo;
CrTable.ApplyLogOnInfo(crtableLogoninfo);
CrystalReportViewer1.LogOnInfo.Add(crtableLogoninfo);
}
foreach (ReportDocument report in crystalReport.Subreports)
{
report.SetDatabaseLogon("user", "pass", "server", "database");
foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in report.Database.Tables)
{
crtableLogoninfo = CrTable.LogOnInfo;
crtableLogoninfo.ConnectionInfo = connectionInfo;
CrTable.ApplyLogOnInfo(crtableLogoninfo);
CrystalReportViewer1.LogOnInfo.Add(crtableLogoninfo);
}
}
string PO = Request.QueryString["PO"];
if (PO != null)
{
ParameterField parameter = new ParameterField();
ParameterDiscreteValue parameterValue = new ParameterDiscreteValue();
parameterValue.Value = PO;
parameter.Name = "@PO";
parameter.CurrentValues.Add(parameterValue);
CrystalReportViewer1.ParameterFieldInfo.Add(parameter);
}
}
当前状态:当报表设置为直接连接到数据库时,此功能有效,但其中大约一半设置为使用 ODBC 连接。
尝试:我尝试将服务器名称切换为 ODBC 连接的名称,但这仍然返回相同的无法打开连接。无法打开连接。
错误。
问题:我似乎无法弄清楚可以在 ConnectionInfo 中更改什么才能使其成功使用 ODBC 连接。我不断收到无法打开连接的消息。打开连接失败。
我知道单独进行连接并设置报告源的解决方案,但这不可行,因为有很多报告。
提前致谢!
最佳答案
运行时设置 ODBC 连接是 rather tricky ,主要是因为需要设置所有这些附加的“登录属性”和“连接属性”:
// DbConnectionAttributes contains some, but not all, consts. var logonProperties = new DbConnectionAttributes(); logonProperties.Collection.Set("Connection String", @"Driver={SQL Server};Server=TODD-PC\SQLEXPRESS2;Trusted_Connection=Yes;"); logonProperties.Collection.Set("UseDSNProperties", false); var connectionAttributes = new DbConnectionAttributes(); connectionAttributes.Collection.Set("Database DLL", "crdb_odbc.dll"); connectionAttributes.Collection.Set("QE_DatabaseName", String.Empty); connectionAttributes.Collection.Set("QE_DatabaseType", "ODBC (RDO)"); connectionAttributes.Collection.Set("QE_LogonProperties", logonProperties); connectionAttributes.Collection.Set("QE_ServerDescription", @"TODD-PC\SQLEXPRESS2"); connectionAttributes.Collection.Set("QE_SQLDB", true); connectionAttributes.Collection.Set("SSO Enabled", false); return new ConnectionInfo { Attributes = connectionAttributes, // These don't seem necessary, but we'll include them anyway: ReportDocument.Load does ServerName = @"TODD-PC\SQLEXPRESS2", Type = ConnectionInfoType.CRQE };
另一方面,您可以使用现有的对象,而不是从头开始创建 ConnectionInfo
对象,特别是如果您已经使用类似的连接设计了报表:
foreach (Table crTable in crTables)
{
TableLogOnInfo tableLogOnInfo = crTable.LogOnInfo;
var connectionInfo = tableLogOnInfo.ConnectionInfo;
// set connection info stuff here
crTable.ApplyLogOnInfo(tableLogOnInfo);
}
关于c# - 使用 ODBC 连接在代码隐藏中加载 Crystal Report,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31455180/