c# - Establecer programáticamente la fuente de datos para un Crystal Report en un Crystal Server a través de servicios web de Crystal
¿Cómo puedo cambiar la fuente de datos (servidor de base de datos, nombre de usuario, contraseña) que un informe de Crystal utiliza en tiempo de ejecución, ejecutándose dentro de un servidor de Crystal?
Tengo un servidor Crystal y he subido informes que tienen un origen de datos establecido (SQL Server 2005 alojado en SERVER A, userA, passwordA). Me gustaría programar los informes para que se ejecuten usando un origen de datos diferente (SQL Server 2005 alojado en SERVER B, userB, passwordB) desde el cliente c# que he escrito.
El cliente de C# puede programar informes para ejecutarse dentro del servidor utilizando objetos proporcionados por los servicios web de Crystal. He estado usando los siguientes 3 objetos:
BIPlatform
InfoObject
CrystalReport
La documentación sobre estos objetos se puede encontrar AQUÍ
Respuesta #1
30/1/2018 - Solo quería agregar que necesitarás la dll CrystalDecisions.ReportAppServer.DataDefModel
Tuve el mismo problema, donde tenía un informe que tenía conexión a la base de datos MSAccess y necesitaba cambiar eso a SQLServer, me tomó 2 días resolver esto:
reportDocument = new ReportDocument();
reportDocument.Load(reportFileName);
TableLogOnInfo tableLogOnInfo = ReportClass.GetSQLTableLogOnInfo(connectionProperties.DatabaseSource, connectionProperties.DatabaseName, connectionProperties.UserName, connectionProperties.Password);
for (int i = 0; i < reportDocument.Database.Tables.Count; i++)
{
Table table = reportDocument.Database.Tables[i];
table.ApplyLogOnInfo(tableLogOnInfo);
}
public static ConnectionInfo GetConnectionInfo(string serverName, string databaseName, string userID, string password)
{
ConnectionInfo connectionInfo = new ConnectionInfo();
connectionInfo.ServerName = serverName;
connectionInfo.DatabaseName = databaseName;
connectionInfo.UserID = userID;
connectionInfo.Password = password;
return connectionInfo;
}
public static TableLogOnInfo GetSQLTableLogOnInfo(string serverName, string databaseName, string userID, string password)
{
CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag connectionAttributes = new CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag();
connectionAttributes.EnsureCapacity(11);
connectionAttributes.Add("Connect Timeout", "15");
connectionAttributes.Add("Data Source", serverName);
connectionAttributes.Add("General Timeout", "0");
connectionAttributes.Add("Initial Catalog", databaseName);
connectionAttributes.Add("Integrated Security", false);
connectionAttributes.Add("Locale Identifier", "1033");
connectionAttributes.Add("OLE DB Services", "-5");
connectionAttributes.Add("Provider", "SQLOLEDB");
connectionAttributes.Add("Tag with column collation when possible", "0");
connectionAttributes.Add("Use DSN Default Properties", false);
connectionAttributes.Add("Use Encryption for Data", "0");
DbConnectionAttributes attributes = new DbConnectionAttributes();
attributes.Collection.Add(new NameValuePair2("Database DLL", "crdb_ado.dll"));
attributes.Collection.Add(new NameValuePair2("QE_DatabaseName", databaseName));
attributes.Collection.Add(new NameValuePair2("QE_DatabaseType", "OLE DB (ADO)"));
attributes.Collection.Add(new NameValuePair2("QE_LogonProperties", connectionAttributes));
attributes.Collection.Add(new NameValuePair2("QE_ServerDescription", serverName));
attributes.Collection.Add(new NameValuePair2("SSO Enabled", false));
ConnectionInfo connectionInfo = ReportClass.GetConnectionInfo(serverName, databaseName, userID, password);
connectionInfo.Attributes = attributes;
connectionInfo.Type = ConnectionInfoType.SQL;
TableLogOnInfo tableLogOnInfo = new TableLogOnInfo();
tableLogOnInfo.ConnectionInfo = connectionInfo;
return tableLogOnInfo;
}
Respuesta #2
CrystalReportSource1.Report = new Report { FileName = @"C:\test.rpt" };
CrystalReportSource1.ReportDocument.SetDatabaseLogon(user,pass,server,db)
