Como configurar um relatório CrystalReport para ler uma ConnectionString do App.Config?
Amigos,
Estou começando a fazer os relatórios do meu sistema, utilizando CrystalReports.
A única maneira de fazer relatório que eu sei é utilizando o wizard, onde eu seto uma nova conexao OleDB Sql Server Provider.
Então eu seto minha máquina como data source, mas eu gostaria que fosse dinâmico, gostaria de utilizar a mesma conexão da aplicação. E a conexão da aplicação é baseada no app.config.
Como eu faria isso? Obrigado
Ps:
O que eu preciso é utilizar essa connection string do App.Config:
preciso ler esse arquivo, separar os 4 campos e passar como parametro pra esse objeto:
ConnectionInfo crConnectionInfo = new ConnectionInfo();
crConnectionInfo.ServerName = "DataSource";
crConnectionInfo.DatabaseName = "InitialCatalog";
crConnectionInfo.UserID = "UserId";
crConnectionInfo.Password = "Password";
Eu sei ler o app.config em um outro projeto que eu mesmo fiz, mas eu adicionava uma key para cada atributo, esse vem com a stringconnection pronta (e esse projeto nao fui eu quem comecei)
Como eu quebro essa string connection para ler os parametros?
Estou começando a fazer os relatórios do meu sistema, utilizando CrystalReports.
A única maneira de fazer relatório que eu sei é utilizando o wizard, onde eu seto uma nova conexao OleDB Sql Server Provider.
Então eu seto minha máquina como data source, mas eu gostaria que fosse dinâmico, gostaria de utilizar a mesma conexão da aplicação. E a conexão da aplicação é baseada no app.config.
Como eu faria isso? Obrigado
Ps:
O que eu preciso é utilizar essa connection string do App.Config:
preciso ler esse arquivo, separar os 4 campos e passar como parametro pra esse objeto:
ConnectionInfo crConnectionInfo = new ConnectionInfo();
crConnectionInfo.ServerName = "DataSource";
crConnectionInfo.DatabaseName = "InitialCatalog";
crConnectionInfo.UserID = "UserId";
crConnectionInfo.Password = "Password";
Eu sei ler o app.config em um outro projeto que eu mesmo fiz, mas eu adicionava uma key para cada atributo, esse vem com a stringconnection pronta (e esse projeto nao fui eu quem comecei)
Como eu quebro essa string connection para ler os parametros?
Daniel Vieira
Curtidas 0
Respostas
Daniel Vieira
12/01/2010
Na outra postagem não apareceu o xml da app.config:
O post deveria ser esse:
Amigos,
Estou começando a fazer os relatórios do meu sistema, utilizando CrystalReports.
A única maneira de fazer relatório que eu sei é utilizando o wizard, onde eu seto uma nova conexao OleDB Sql Server Provider.
Então eu seto minha máquina como data source, mas eu gostaria que fosse dinâmico, gostaria de utilizar a mesma conexão da aplicação. E a conexão da aplicação é baseada no app.config.
Como eu faria isso? Obrigado
Ps:
O que eu preciso é utilizar essa connection string do App.Config:
'<connectionStrings>
' <add name="Entities" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;'provider=System.Data.SqlClient;provider connection string="Data Source=Server;Initial Catalog=Banco; 'User Id=ID;Password=Senha; Integrated Security=True;MultipleActiveResultSets=True"" 'providerName="System.Data.EntityClient" />
' </connectionStrings>
preciso ler esse arquivo, separar os 4 campos e passar como parametro pra esse objeto:
ConnectionInfo crConnectionInfo = new ConnectionInfo();
crConnectionInfo.ServerName = "DataSource";
crConnectionInfo.DatabaseName = "InitialCatalog";
crConnectionInfo.UserID = "UserId";
crConnectionInfo.Password = "Password";
Eu sei ler o app.config de um outro projeto que eu mesmo fiz, mas eu adicionava uma key para cada atributo, esse vem com a stringconnection pronta (e esse projeto nao fui eu quem comecei)
Como eu quebro essa string connection para ler os parametros?
O post deveria ser esse:
Amigos,
Estou começando a fazer os relatórios do meu sistema, utilizando CrystalReports.
A única maneira de fazer relatório que eu sei é utilizando o wizard, onde eu seto uma nova conexao OleDB Sql Server Provider.
Então eu seto minha máquina como data source, mas eu gostaria que fosse dinâmico, gostaria de utilizar a mesma conexão da aplicação. E a conexão da aplicação é baseada no app.config.
Como eu faria isso? Obrigado
Ps:
O que eu preciso é utilizar essa connection string do App.Config:
'<connectionStrings>
' <add name="Entities" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;'provider=System.Data.SqlClient;provider connection string="Data Source=Server;Initial Catalog=Banco; 'User Id=ID;Password=Senha; Integrated Security=True;MultipleActiveResultSets=True"" 'providerName="System.Data.EntityClient" />
' </connectionStrings>
preciso ler esse arquivo, separar os 4 campos e passar como parametro pra esse objeto:
ConnectionInfo crConnectionInfo = new ConnectionInfo();
crConnectionInfo.ServerName = "DataSource";
crConnectionInfo.DatabaseName = "InitialCatalog";
crConnectionInfo.UserID = "UserId";
crConnectionInfo.Password = "Password";
Eu sei ler o app.config de um outro projeto que eu mesmo fiz, mas eu adicionava uma key para cada atributo, esse vem com a stringconnection pronta (e esse projeto nao fui eu quem comecei)
Como eu quebro essa string connection para ler os parametros?
GOSTEI 0
Fabio Mans
12/01/2010
Daniel segue um exemplo
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="ConnectionString" value="Data Source=172.31.0.71;Initial Catalog=intranetfrsp;Persist Security Info=True;User ID=logaiservice;Password=entraiservice"/>
</appSettings>
<connectionStrings>
<add name="Entities" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string=string;Data Source=Server;Initial Catalog=Banco;User Id=ID;Password=Senha;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.EntityClient" />
</connectionStrings>
</configuration>
using System;
using System.Configuration;
using System.Windows.Forms;private void button1_Click(object sender, EventArgs e)
{
//Se utilizar key
AppSettingsReader configurationAppSettings = new AppSettingsReader();
string caminho = configurationAppSettings.GetValue("ConnectionString", typeof(String)).ToString();
string[] parts = caminho.Split(";".ToCharArray()); //Se utilizar connection string string caminhoEntity = ConfigurationManager.ConnectionStrings["Entities"].ToString();
string[] partsEntity = caminhoEntity.Split(";".ToCharArray());
string serverName = partsEntity[3];
string databaseName = partsEntity[4];
string userID = partsEntity[5];
string password = partsEntity[6]; } Espero ter ajudado Fabio
string caminho = configurationAppSettings.GetValue("ConnectionString", typeof(String)).ToString();
string[] parts = caminho.Split(";".ToCharArray()); //Se utilizar connection string string caminhoEntity = ConfigurationManager.ConnectionStrings["Entities"].ToString();
string[] partsEntity = caminhoEntity.Split(";".ToCharArray());
string serverName = partsEntity[3];
string databaseName = partsEntity[4];
string userID = partsEntity[5];
string password = partsEntity[6]; } Espero ter ajudado Fabio
GOSTEI 0
Daniel Vieira
12/01/2010
Fábio, tive que tirar 1 de cada index, estava apontando pra um index a mais no exemplo, nada que atrapalhe.
Mas seguinte, rodando em um messagebox pra ver os valores, eu obtive o seguinte:
Eu gostaria somente do valor, está passando também a descrição do valor, isso me gera um erro.
Ps: uma dúvida simples, o projeto tem 2 app.config, mas o que é válido pra leitura de strconn é sempre o app.config que fica no projeto main, o projeto que será o primeiro a ser executado na solution, correto?
Mas seguinte, rodando em um messagebox pra ver os valores, eu obtive o seguinte:
Eu gostaria somente do valor, está passando também a descrição do valor, isso me gera um erro.
Ps: uma dúvida simples, o projeto tem 2 app.config, mas o que é válido pra leitura de strconn é sempre o app.config que fica no projeto main, o projeto que será o primeiro a ser executado na solution, correto?
GOSTEI 0
Fabio Mans
12/01/2010
Daniel você não pode colocar no App.Config os dados ao invés de utilizar a string de conexão do Entity?
Porque senão fica complicado, para quebrar o critério é o ; (ponto vírgula) caso contrário não da para fazer o Split, tem que ter um critério para quebrar, sobre o App.Config é que fica na raiz do projeto.
Fabio
GOSTEI 0
Daniel Vieira
12/01/2010
é que fica difícil pra mim mudar o app.config, como não fui eu quem comecei o projeto, não sei quais consequencias isso traria pro projeto.
Se eu adicionar keys ao app.config isso vai influir em alguma parte que leia a stringconnection, se eu nao modificar ela?
Se eu adicionar keys ao app.config isso vai influir em alguma parte que leia a stringconnection, se eu nao modificar ela?
GOSTEI 0
Fabio Mans
12/01/2010
Não tem problema, você pode colocar quantas keys ou connections você quiser.
Faz o seguinte coloca uma Key assim.
<add key="minhaConexao" value="server;banco;usuario;senha/>
Deste jeito você recupera e a key minhaConexao e fica do jeito que você quer.
Fabio
==================================
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="ConnectionString" value="Data Source=172.31.0.71;Initial Catalog=intranetfrsp;Persist Security Info=True;User ID=logaiservice;Password=entraiservice"/>
</appSettings>
<connectionStrings>
<add name="Entities" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string=string;Data Source=Server;Initial Catalog=Banco;User Id=ID;Password=Senha;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.EntityClient" />
</connectionStrings>
</configuration>
using System;
using System.Configuration;
using System.Windows.Forms;private void button1_Click(object sender, EventArgs e)
{
//Se utilizar key
AppSettingsReader configurationAppSettings = new AppSettingsReader();
string caminho = configurationAppSettings.GetValue("ConnectionString", typeof(String)).ToString();
string[] parts = caminho.Split(";".ToCharArray()); //Se utilizar connection string string caminhoEntity = ConfigurationManager.ConnectionStrings["Entities"].ToString();
string[] partsEntity = caminhoEntity.Split(";".ToCharArray());
string serverName = partsEntity[3];
string databaseName = partsEntity[4];
string userID = partsEntity[5];
string password = partsEntity[6]; } Espero ter ajudado Fabio
string caminho = configurationAppSettings.GetValue("ConnectionString", typeof(String)).ToString();
string[] parts = caminho.Split(";".ToCharArray()); //Se utilizar connection string string caminhoEntity = ConfigurationManager.ConnectionStrings["Entities"].ToString();
string[] partsEntity = caminhoEntity.Split(";".ToCharArray());
string serverName = partsEntity[3];
string databaseName = partsEntity[4];
string userID = partsEntity[5];
string password = partsEntity[6]; } Espero ter ajudado Fabio
GOSTEI 0
Daniel Vieira
12/01/2010
Obrigado Fabio, vou usar.
Seguinte:
Eu fiz um CrystalReport utilizando o Wizard, usei inclusive uma nova Conexao OLEDB SqlServer provider, onde setei server, base user pass etc.
O report ficou estatico, so funcionando na minha maquina.
Pesquisando um pouco, vi como passar parametros ao report, e passei um list.
Esse list vem de dados que estão utilizando a conexao corrente do sistema que esta em runtime.
So de atribuir acabou funcionando, em todas as maquinas, o report, com os dados correntes que vem da base de dados ao qual o projeto esta conectado.
Tem problema eu ter feito o report via Wizard, setando conexao estatica com minha maquina, e depois fazer essa atribuicao?
Vou postar o metodo que estou usando no load do form que contem o reportviewer:
private void frmRPTProdutos_Load(object sender, EventArgs e)
{
try
{
//Novo reportDocument
ReportDocument cryRpt = new ReportDocument();
//Le o caminho do executavel do sistema
string pathExeApp = Application.StartupPath;
int cont = 0;
string unidade = "";
//Le o caminho ate chegar a pasta raiz do sistema, Construsys
while (pathExeApp.Substring(cont, 11).ToLower() != @"construsys\")
{
unidade += pathExeApp.Substring(cont, 1);
cont++;
}
unidade += @"construsys\";
//Concatena o caminho inicial com a localização do report
string caminhoReports = unidade + "Materiais\\Reports\\rptProdutos.rpt";
//Le o report
cryRpt.Load(caminhoReports);
//Query para popular o report
Entities db = new Entities();
var list = (from p in db.Produto select p).OrderBy(p => p.codigo).ToList();
//Atribuicao da query ao report
cryRpt.SetDataSource(list);
//Exibe o report no ReportViewer
crystalReportViewer1.ReportSource = cryRpt;
crystalReportViewer1.Refresh();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Seguinte:
Eu fiz um CrystalReport utilizando o Wizard, usei inclusive uma nova Conexao OLEDB SqlServer provider, onde setei server, base user pass etc.
O report ficou estatico, so funcionando na minha maquina.
Pesquisando um pouco, vi como passar parametros ao report, e passei um list.
Esse list vem de dados que estão utilizando a conexao corrente do sistema que esta em runtime.
So de atribuir acabou funcionando, em todas as maquinas, o report, com os dados correntes que vem da base de dados ao qual o projeto esta conectado.
Tem problema eu ter feito o report via Wizard, setando conexao estatica com minha maquina, e depois fazer essa atribuicao?
Vou postar o metodo que estou usando no load do form que contem o reportviewer:
private void frmRPTProdutos_Load(object sender, EventArgs e)
{
try
{
//Novo reportDocument
ReportDocument cryRpt = new ReportDocument();
//Le o caminho do executavel do sistema
string pathExeApp = Application.StartupPath;
int cont = 0;
string unidade = "";
//Le o caminho ate chegar a pasta raiz do sistema, Construsys
while (pathExeApp.Substring(cont, 11).ToLower() != @"construsys\")
{
unidade += pathExeApp.Substring(cont, 1);
cont++;
}
unidade += @"construsys\";
//Concatena o caminho inicial com a localização do report
string caminhoReports = unidade + "Materiais\\Reports\\rptProdutos.rpt";
//Le o report
cryRpt.Load(caminhoReports);
//Query para popular o report
Entities db = new Entities();
var list = (from p in db.Produto select p).OrderBy(p => p.codigo).ToList();
//Atribuicao da query ao report
cryRpt.SetDataSource(list);
//Exibe o report no ReportViewer
crystalReportViewer1.ReportSource = cryRpt;
crystalReportViewer1.Refresh();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
GOSTEI 0
Fabio Mans
12/01/2010
Não tem problema algum, 90% dos relatórios são feitos assim, ou seja o modo mais fácil.
Fabio
GOSTEI 0
Daniel Vieira
12/01/2010
Opa obrigado Fabio, legal saber que estou no caminho certo.
Só uma última dúvida pra encerrarmos o chamado:
Eu fiz um primeiro relatório (o que está funcionando) somente com uma tabela, e no DataSource do report passei um select dessa tabela.
Quando eu fiz um outro report, que envolvia uma junção de 3 tabelas, fui rodar em outras máquinas e ficou pedindo credenciais.
Eu tenho que fazer um select que preencha totalmente as junções das tabelas que populam o datasource?
Só uma última dúvida pra encerrarmos o chamado:
Eu fiz um primeiro relatório (o que está funcionando) somente com uma tabela, e no DataSource do report passei um select dessa tabela.
Quando eu fiz um outro report, que envolvia uma junção de 3 tabelas, fui rodar em outras máquinas e ficou pedindo credenciais.
Eu tenho que fazer um select que preencha totalmente as junções das tabelas que populam o datasource?
GOSTEI 0
Fabio Mans
12/01/2010
Daniel eu acho que não, o select não tem nada a ver com autenticação, reveja como você fez um e depois o outro.
Fabio
GOSTEI 0
Daniel Vieira
12/01/2010
Mas eu nao refiz a autenticacao Fabio, unica coisa que eu fiz foi refazer o datasource e atribuir.
Ja testei em outras maquinas e funciona, inclusive com a minha fora da rede e desligada, (e tambem cada instancia do sql tem dados diferentes, 2 maquinas de teste e outra de producao, e em cada maquina exibiu os dados do sql correspondente)
Fiz os seguintes passos:
1- Usei o Wizard do Crystal, Setei New OLEDB SqlProvider pra minha maquina
2- No load do form que contem o reportViewer eu coloquei o seguinte codigo:
private void frmRPTProdutos_Load(object sender, EventArgs e)
{
try
{
//Novo reportDocument
ReportDocument cryRpt = new ReportDocument();
//Le o caminho do executavel do sistema
string pathExeApp = Application.StartupPath;
int cont = 0;
string unidade = "";
//Le o caminho ate chegar a pasta raiz do sistema, Construsys
while (pathExeApp.Substring(cont, 11).ToLower() != @"construsys\")
{
unidade += pathExeApp.Substring(cont, 1);
cont++;
}
unidade += @"construsys\";
//Concatena o caminho inicial com a localização do report
string caminhoReports = unidade + "Materiais\\Reports\\rptProdutos.rpt";
//Le o report
cryRpt.Load(caminhoReports);
//Query para popular o report
Entities db = new Entities();
var list = (from p in db.Produto select p).OrderBy(p => p.codigo).ToList();
//Atribuicao da query ao report
cryRpt.SetDataSource(list);
//Exibe o report no ReportViewer
crystalReportViewer1.ReportSource = cryRpt;
crystalReportViewer1.Refresh();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Ja testei em outras maquinas e funciona, inclusive com a minha fora da rede e desligada, (e tambem cada instancia do sql tem dados diferentes, 2 maquinas de teste e outra de producao, e em cada maquina exibiu os dados do sql correspondente)
Fiz os seguintes passos:
1- Usei o Wizard do Crystal, Setei New OLEDB SqlProvider pra minha maquina
2- No load do form que contem o reportViewer eu coloquei o seguinte codigo:
private void frmRPTProdutos_Load(object sender, EventArgs e)
{
try
{
//Novo reportDocument
ReportDocument cryRpt = new ReportDocument();
//Le o caminho do executavel do sistema
string pathExeApp = Application.StartupPath;
int cont = 0;
string unidade = "";
//Le o caminho ate chegar a pasta raiz do sistema, Construsys
while (pathExeApp.Substring(cont, 11).ToLower() != @"construsys\")
{
unidade += pathExeApp.Substring(cont, 1);
cont++;
}
unidade += @"construsys\";
//Concatena o caminho inicial com a localização do report
string caminhoReports = unidade + "Materiais\\Reports\\rptProdutos.rpt";
//Le o report
cryRpt.Load(caminhoReports);
//Query para popular o report
Entities db = new Entities();
var list = (from p in db.Produto select p).OrderBy(p => p.codigo).ToList();
//Atribuicao da query ao report
cryRpt.SetDataSource(list);
//Exibe o report no ReportViewer
crystalReportViewer1.ReportSource = cryRpt;
crystalReportViewer1.Refresh();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
GOSTEI 0
Fabio Mans
12/01/2010
Aparentemento está OK, quando você diz credencias o que significa?
GOSTEI 0
Fabio Mans
12/01/2010
Aparentemente está OK, quando você diz credencias o que significa?
GOSTEI 0
Daniel Vieira
12/01/2010
Credenciais quero dizer que o report pede usuario e senha da base pra rodar, ou seja, ele esta utilizando outra máquina na rede.
Eu estou bem confuso com essa parte, nem sei como rodou!
Eu estou bem confuso com essa parte, nem sei como rodou!
GOSTEI 0
Fabio Mans
12/01/2010
Você tem um DBA na sua empresa para te ajudar?
GOSTEI 0
Daniel Vieira
12/01/2010
Que nada, tem somente eu e uma programadora em início, aprendendo comigo o pouco que sei...Eu sou o principal desenvolvedor, alem de tester, dba e afins...
Estou com a mesma discussão em um tópico no DevMedia:
http://social.msdn.microsoft.com/Forums/pt-BR/vscsharppt/thread/217bfe64-ecd0-4b0e-9a0a-8ed1f0569adb
Sou o Daniel Vieira.
A discussão tomou um rumo um pouco diferente, mas não consigo fazer os exemplos que o amigo postou
Estou com a mesma discussão em um tópico no DevMedia:
http://social.msdn.microsoft.com/Forums/pt-BR/vscsharppt/thread/217bfe64-ecd0-4b0e-9a0a-8ed1f0569adb
Sou o Daniel Vieira.
A discussão tomou um rumo um pouco diferente, mas não consigo fazer os exemplos que o amigo postou
GOSTEI 0
Fabio Mans
12/01/2010
Posso ajudar em mais alguma coisa?
GOSTEI 0