¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Migração de aplicação .NET para 64 bits: Solução para Crystal Reports com base de dados MS Access

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

Olá,

Tenho uma aplicação .NET 1.0/VS 2003 com Crystal Reports que utiliza um banco de dados MS Access. Estou migrando para .NET 4.0/VS2010. A aplicação de 32 bits funciona bem, mas a de 64 bits não. Descobri que o driver OLE DB que estava usando não existe (e não existirá) na versão de 64 bits, então instalei o "Motor de Banco de Dados Microsoft Access 2010 Redistribuível" recomendado. O aplicativo de formulários do Windows se conecta corretamente ao banco de dados, mas o Crystal Reports não: qualquer tentativa de exibir um relatório no visualizador de relatórios falha com a mensagem "Erro ao carregar informações do banco de dados...". Anexei a captura de tela, juntamente com os arquivos de depuração do CR.

Aqui está o código que estou usando para conectar os formulários do Windows ao banco de dados (a conexão antiga está comentada):


ConnectionString =
    @"Provedor=Microsoft.ACE.OLEDB.12.0;Senha="""";" +
    //@"Provedor=Microsoft.Jet.OLEDB.4.0;Senha="""";" +
    @"ID do Usuário=Admin;Fonte de Dados=" +
    RotaBaseDeDados + ";Modo=Compartilhar Negar Nenhum;" +
    @"Jet OLEDB:Senha do Banco de Dados=""minha_senha""";



Este é o código que estou usando para conectar o CR ao banco de dados:


foreach (Tabela t em rpt.BaseDeDados.Tabelas)
{
    InformacaoLogOnTabela logOnInfo = new InformacaoLogOnTabela();
    logOnInfo = t.InformacaoLogOn;
    InformacaoConexao connectionInfo = new InformacaoConexao();
    connectionInfo = logOnInfo.InformacaoConexao;
    connectionInfo.NomeBancoDeDados = RotaBaseDeDados ;
    connectionInfo.NomeServidor = RotaBaseDeDados ;
    connectionInfo.Senha = "minha_senha";
    t.AplicarInformacaoLogOn(logOnInfo);
}

  .lyLogOnInfo(logOnInfo);



Devo dizer que, devido à falta de documentação, não tenho certeza se a segunda parte do código está correta (além de funcionar bem em um sistema operacional de 32 bits) e qual driver de banco de dados está sendo usado.

Agradeceria qualquer ajuda (que não seja alterar o banco de dados, o que não é possível no 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...

Comentário sobre " O CR só aceita acesso de 64 bits usando ODBC ou OLE DB, JET ou ACE não são compatíveis. " - Não são ODBC e OLE DB simplesmente interfaces para JET/ACE? Neste exemplo a Microsoft explica OLE DB usando JET como exemplo. Além disso, após instalar o ACE de 64 bits, consegui conectar o CR ao banco de dados através de uma conexão ODBC referenciando o driver do Access. Um problema pendente é que meu banco de dados está protegido por senha (não por usuário) e não sei como integrar a senha do banco de dados na string de conexão ODBC.

Além disso, ao recuperar TableLogOnInfo de uma tabela no relatório, encontro o caminho do meu banco de dados em todas as propriedades a seguir:

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

Devo sobrescrevê-los todos ao construir uma string de conexão ODBC sem DSN?

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

Olá Marko,

O CR só aceita acesso de 64 bits através de ODBC ou OLE DB, JET ou ACE não são compatíveis.

Além disso, para obter o driver de 64 bits, você precisa instalar o cliente de 64 bits que pode ser baixado da Microsoft.

A Microsoft não permite ter instalados na MESMA PC os drivers de acesso ODBC/OLE DB de 32 e 64 bits.

Depois de configurar isso, funciona assim:

// Criar uma nova tabela de banco de dados para substituir a tabela atual dos relatórios.

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();

// Obter a coleção de tabelas de banco de dados para o seu relatório

CrystalDecisions.ReportAppServer.DataDefModel.Tables boTables;

boTables = rptClientDoc.DatabaseController.Database.Tables;

// Obter a informação de conexão antiga

oldConnInfos = rptClientDoc.DatabaseController.GetConnectionInfos(null);

boTable.ConnectionInfo = boConnectionInfo;

oldConnInfo = oldConnInfos[0];

# region Acesso 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("ERRO: " + ex.Message);

//return;

}

difference = DateTime.Now.Subtract(dtStart);

//rptTable.Location = rptTable.Name;

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

}

}

catch (Exception ex)

{

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

//return;

}

// verificar sub-relatórios

...

Tenha em mente que você precisa usar RAS para obter a informação de conexão antiga.

Don

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

Talvez não fui claro o suficiente, não estou falando sobre designer VS IDE/CR, mas sim sobre o aplicativo final (.exe). O que não encontrei claramente explicado na documentação do CR é se o CR funciona com ACE de 64 bits (já que compilo o EXE de 64 bits, presumo que todos os componentes do CR também sejam de 64 bits).

(Tenho um número variável de bancos de dados Access .mdb, então me conecto a eles programaticamente a partir do aplicativo).

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

A aplicação Crystal Designer é de 32 bits, portanto requer uma conexão de banco de dados de 32 bits. Se você tiver apenas o cliente de 64 bits instalado, isso pode estar causando o problema.

Além disso, consulte as respostas de Abhilash aqui:

-Dell

A mensagem foi editada 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?