¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Migración de aplicación .NET a 64 bits: Solución para Crystal Reports con base de datos MS Access

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 28 Vistas
0
Cargando...

Hola,

Tengo una aplicación .NET 1.0/VS 2003 con Crystal Reports que utiliza una base de datos MS Access. La estoy migrando a .NET 4.0/VS2010. La aplicación de 32 bits funciona bien, pero la de 64 bits no lo hace. Para empezar, descubrí que el controlador OLE DB que usaba no existe (y no existirá) en versión de 64 bits, por lo que instalé el "Motor de base de datos de Microsoft Access 2010 Redistribuible" recomendado. La aplicación de formularios de Windows se conecta correctamente a la base de datos, pero Crystal Reports no lo hace: cualquier intento de mostrar un informe en el visor de informes falla con el mensaje "Error al cargar la información de la base de datos...". Adjunté la captura de pantalla, junto con los archivos de depuración de CR.

Aquí está el código que uso para conectar los formularios de Windows a la base de datos (la conexión antigua está comentada):


ConnectionString =
    @"Proveedor=Microsoft.ACE.OLEDB.12.0;Contraseña="""";" +
    //@"Proveedor=Microsoft.Jet.OLEDB.4.0;Contraseña="""";" +
    @"ID de Usuario=Admin;Origen de Datos=" +
    RutaBaseDeDatos + ";Modo=Compartir Denegar Ninguno;" +
    @"Jet OLEDB:Contraseña de la Base de Datos=""mi_contraseña""";



Este es el código que uso para conectar CR a la base de datos:


foreach (Tabla t en rpt.BaseDeDatos.Tablas)
{
    InformacionLogOnTabla logOnInfo = new InformacionLogOnTabla();
    logOnInfo = t.InformacionLogOn;
    InformacionConexion connectionInfo = new InformacionConexion();
    connectionInfo = logOnInfo.InformacionConexion;
    connectionInfo.NombreBaseDeDatos = RutaBaseDeDatos ;
    connectionInfo.NombreServidor = RutaBaseDeDatos ;
    connectionInfo.Contraseña = "mi_contraseña";
    t.AplicarInformacionLogOn(logOnInfo);
}

  .lyLogOnInfo(logOnInfo);



Debo decir que debido a la falta de documentación, no estoy seguro si la segunda parte del código es correcta (más allá de que funciona bien en un sistema operativo de 32 bits) y qué controlador de base de datos utiliza.

Agradecería cualquier ayuda (que no sea cambiar la base de datos, lo cual no es posible en este momento).

poslov.vshost_4172_2016-2-10-14-42-55
Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

4 Respuestas

0
Cargando...

Comentario sobre " CR solo admite el acceso de 64 bits utilizando ODBC u OLE DB, JET o ACE no son compatibles. " - ¿no son ODBC y OLE DB simplemente interfaces para JET/ACE? En este ejemplo Microsoft explica OLE DB utilizando JET como ejemplo. Además, después de instalar ACE de 64 bits, logré conectar CR a la base de datos mediante una conexión ODBC haciendo referencia al controlador de Access. Un problema pendiente es el hecho de que mi base de datos está protegida por contraseña (no por usuario) y no sé cómo integrar la contraseña de la base de datos en la cadena de conexión ODBC.

Además, cuando recupero TableLogOnInfo de una tabla en el informe, encuentro la ruta de mi base de datos en todas las propiedades siguientes:

  • Attributes[1].Value
  • Attributes[4].Value
  • DatabaseName
  • LogonProperties[0].Value
  • ServerName

¿Se supone que debo sobrescribirlos todos al construir una cadena de conexión ODBC sin DSN?

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola Marko,

CR solo admite el acceso de 64 bits mediante ODBC u OLE DB, JET o ACE no son compatibles.

Además, para obtener el controlador de 64 bits, debes instalar el cliente de 64 bits que puedes descargar de Microsoft.

MS no permite tener instalados en la MISMA PC los controladores de acceso ODBC/OLE DB de 32 y 64 bits.

Una vez que hayas configurado esto, funciona así:

//Crear una nueva tabla de base de datos para reemplazar la tabla actual de los informes.

CrystalDecisions.ReportAppServer.DataDefModel.Table boTable = new CrystalDecisions.ReportAppServer.DataDefModel.Table();

CrystalDecisions.ReportAppServer.DataDefModel.Table subboTable = new CrystalDecisions.ReportAppServer.DataDefModel.Table();

CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo newConnInfo = new CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo();

CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo oldConnInfo;

CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfos oldConnInfos;

CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo boConnectionInfo = new CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo();

//Obtener la colección de tablas de base de datos para tu informe

CrystalDecisions.ReportAppServer.DataDefModel.Tables boTables;

boTables = rptClientDoc.DatabaseController.Database.Tables;

// Obtener la información de conexión antigua

oldConnInfos = rptClientDoc.DatabaseController.GetConnectionInfos(null);

boTable.ConnectionInfo = boConnectionInfo;

oldConnInfo = oldConnInfos[0];

# region Acceso DAO

if (oldConnInfo.Attributes["Database DLL"].ToString() == "crdb_dao.dll")

{

// Motor

CrystalDecisions.CrystalReports.Engine.ReportObjects crReportObjects;

CrystalDecisions.CrystalReports.Engine.SubreportObject crSubreportObject;

CrystalDecisions.CrystalReports.Engine.ReportDocument crSubreportDocument;

CrystalDecisions.CrystalReports.Engine.Database crDatabase;

CrystalDecisions.CrystalReports.Engine.Tables crTables;

CrystalDecisions.Shared.TableLogOnInfo tLogonInfo;

btnSQLStatement.Text = "";

try

{

foreach (CrystalDecisions.CrystalReports.Engine.Table rptTable in rpt.Database.Tables)

{

tLogonInfo = rptTable.LogOnInfo;

tLogonInfo.ConnectionInfo.ServerName = @"D:\Atest\482607\Latest\dsTimesheet.xml";

tLogonInfo.ConnectionInfo.DatabaseName = newDataFile; // D:\Atest\199019\ot_tmp88.mdb

tLogonInfo.ConnectionInfo.UserID = "";

tLogonInfo.ConnectionInfo.Password = "";

tLogonInfo.TableName = rptTable.Name;

dtStart = DateTime.Now;

try

{

rptTable.ApplyLogOnInfo(tLogonInfo);

}

catch (Exception ex)

{

MessageBox.Show("ERROR: " + ex.Message);

//return;

}

difference = DateTime.Now.Subtract(dtStart);

//rptTable.Location = rptTable.Name;

btnSQLStatement.Text += /*rptTable.Name.ToString() +*/ " Establecido en " + difference.Minutes.ToString() + ":" + difference.Seconds.ToString() + ":" + difference.Milliseconds.ToString() + "\n";

}

}

catch (Exception ex)

{

MessageBox.Show("ERROR: " + ex.Message);

//return;

}

// verificar subinformes

...

Ten en cuenta que necesitas usar RAS para obtener la información de conexión antigua.

Don

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Quizás no he sido lo suficientemente claro, no estoy hablando del diseñador VS IDE/CR, sino de la aplicación final (.exe). Lo que no he encontrado claramente explicado en la documentación de CR es si CR funciona con ACE de 64 bits (ya que compilo el EXE de 64 bits, supongo que todos los componentes de CR también son de 64 bits).

(Tengo un número variable de bases de datos Access .mdb, por lo que me conecto a ellas programáticamente desde la aplicación).

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

La aplicación Crystal designer es de 32 bits, por lo que requiere una conexión de base de datos de 32 bits. Si solo tienes instalado el cliente de 64 bits, eso es lo que está causando el problema.

Además, consulta las respuestas de Abhilash aquí:

-Dell

El mensaje fue editado por: Dell Stinnett-Christy

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?