Usuário com melhor resposta
Como construir uma conexão com Entity Framework em "runt-time"

Pergunta
-
Olá Pessoal,
Estou com um grande problema no uso do EntityDataModel na minha solução, preciso "montar" toda minha conection string em tempo de execução.
Possui o Modelo criado na solução, porém não posso salvar o arquivo App.config, gostaria de saber se é possível isso e sem o uso do Arquivo App.Config ?
Tentei n maneiras e sempre caio em um de "The underlying provider failed on Open".
Segue o Código testado:
public static EntityConnectionStringBuilder connString()
{
// Specify the provider name, server and database.
string providerName = "System.Data.SqlClient";
string serverName = "SERVER";
string databaseName = "DATABASE";
string userId = "USER";
string password = "SENHA";
// Initialize the connection string builder for the
// underlying provider.
SqlConnectionStringBuilder sqlBuilder =
new SqlConnectionStringBuilder();
// Set the properties for the data source.
sqlBuilder.DataSource = serverName;
sqlBuilder.InitialCatalog = databaseName;
//sqlBuilder.IntegratedSecurity = true;
sqlBuilder.UserID = userId;
sqlBuilder.Password = password;
// Build the SqlConnection connection string.
string providerString = sqlBuilder.ToString();
// Initialize the EntityConnectionStringBuilder.
EntityConnectionStringBuilder entityBuilder =
new EntityConnectionStringBuilder();
// Set the Metadata location.
entityBuilder.Metadata = @"res://*/Models.Msdn.csdl|res://*/Models.Msdn.ssdl|res://*/Models.Msdn.msl";
//Set the provider name.
entityBuilder.Provider = providerName;
// Set the provider-specific connection string.
entityBuilder.ProviderConnectionString = providerString;
return entityBuilder;
}
public void TESTE()
{
string s = Convert.ToString(connString());
EntityConnection con = new EntityConnection(s);
try
{
using (Entities context = new Entities(con))
{
con.Open();
MessageBox.Show("OK");
con.Close();
// Some code here
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}Raphael Pugliesi
Respostas
-
Legal,
Estão estamos a caminho da conclusão que o problema é de configuração do servidor ou do SQL...
Pois o nome não esta sendo possível ser resolvido.
Se vc fizer um PING tentando conectar da máquina client no seu servidor funciona?
[]s!
Fernando Henrique Inocêncio Borba Ferreira
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.com/
Twitter: @ferhenrique- Marcado como Resposta Pugliesi quinta-feira, 22 de março de 2012 10:01
Todas as Respostas
-
Olá Raphael,
Tudo bem?
Fiz alguns testes e consegui reproduzir seu problema, ele pode estar associado a duas questões:
1 - Vc esta tentando acessr uma instância do SQLExpress e não decorou corretamente a string de conexão com a palavra chava SQLExpress.
2 - O usuário não possui permissões na base de dados
De uma olhada na InnerException, ela irá detalhar os detalhes de seu erro.
O fonte que utilizei para testar foi o seguinte (alternando entre IntegratedSecurity e credenciais de usuário do SQL)
// Specify the provider name, server and database. string providerName = "System.Data.SqlClient"; string serverName = @".\SqlExpress"; string databaseName = "dbExperiment"; // Initialize the connection string builder for the // underlying provider. SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder(); // Set the properties for the data source. sqlBuilder.DataSource = serverName; sqlBuilder.InitialCatalog = databaseName; sqlBuilder.IntegratedSecurity = true; // Build the SqlConnection connection string. string providerString = sqlBuilder.ToString(); // Initialize the EntityConnectionStringBuilder. EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); //Set the provider name. entityBuilder.Provider = providerName; // Set the provider-specific connection string. entityBuilder.ProviderConnectionString = providerString; // Set the Metadata location. entityBuilder.Metadata = @"res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl"; Console.WriteLine(entityBuilder.ToString()); using (EntityConnection conn = new EntityConnection(entityBuilder.ToString())) { conn.Open(); Console.WriteLine("Just testing the connection."); conn.Close(); } Console.Read();
[]s!Fernando Henrique Inocêncio Borba Ferreira
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.com/
Twitter: @ferhenrique- Sugerido como Resposta Olavo Oliveira NetoModerator terça-feira, 20 de março de 2012 12:23
-
-
Olá Raphael,
Para conectar no SQL creio que vc deva fazer as seguintes alterações:
1 - configurar o nome do seu server de banco de dados, verifique se a versão instalada não é a Express:
string serverName = @"NomeDoServidorDeBancoDeDados";
2 - configurar as credenciais do seu usuário:
sqlBuilder.IntegratedSecurity = false; sqlBuilder.PersistSecurityInfo = true; sqlBuilder.Password = "senha"; sqlBuilder.UserID = @"NomeDoUsuario"; // Verifique se não é necessário o domínio
3 - Verifique se o seu servidor SQL permite conexões remotas
4 - Crie um projeto de teste e adicione um ADO.Net Entity Data Model, e tente simular a conexão com este banco de dados
Suas aplicação é web ou local?
[]s!
Fernando Henrique Inocêncio Borba Ferreira
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.com/
Twitter: @ferhenrique -
-
Vc chegou a adicionar permissões para seu usuário no banco de dados?
Tentou conectar utilizando Integrated Security?
[]s!
Fernando Henrique Inocêncio Borba Ferreira
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.com/
Twitter: @ferhenrique -
Fernando,
A arquitetura da minha solução é a seguinte, o aplicativo EXE e suas DLL's devem ficar na REDE e a execução do aplicativo no client acontence "remotamente".
Quando a aplicação está local "por exemplo no meu computador" funciona perfeitamente, quando a aplicação está na rede e executo "remotamente" apresenta o erro de conexão, segue o erro:
Havia pensado que esse erro acontecia devido ao fato da connectionstring estar no arquivo de App.config, porém não é. Você faz idéia o que possa ser ?
Raphael Pugliesi
-
Fernando,
A arquitetura da minha solução é a seguinte, o aplicativo EXE e suas DLL's devem ficar na REDE e a execução do aplicativo no client acontence "remotamente".
Quando a aplicação está local "por exemplo no meu computador" funciona perfeitamente, quando a aplicação está na rede e executo "remotamente" apresenta o erro de conexão, segue o erro:
Havia pensado que esse erro acontecia devido ao fato da connectionstring estar no arquivo de App.config, porém não é. Você faz idéia o que possa ser ?
Raphael Pugliesi
-
Olá Raphael,
Se vc observar o trace da InnerException verá que existe o trecho "the server was not found ow was not accessible", isto é: a sua string de conexão não esta conseguindo encontra o servidor ou a instância do SQL que ali esta instalada.
O que vc pode fazer é criar um teste de conexão na máquina cliente, para isso faça o seguinte:
1 - Abra a máquina cliente
2 - Crie um arquivo de nome TESTE.udl na área de trabalho (é importante que o arquivo tenha a extensão .udl)
3 - Abra o arquivo .Udl e tente configurar a conexão para o seu servidor de banco de dados
4 - Depois de configurado, e visto que a conexão funcionou, altere a extensão do arquivo para .txt e pegue a string de conexão gerada.
Isso será suficiente para descobrir o caminho correto de conexão.
Outra coisa, poste sua string de conexão para conseguirmos ver se seu SQL é Express ou outra versão.
[]s!
Fernando Henrique Inocêncio Borba Ferreira
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.com/
Twitter: @ferhenrique -
Fernando,
Segue a string de Conexão:
<add name="DBDEEntities" connectionString="metadata=res://*/EDMfweDAL.csdl|res://*/EDMfweDAL.ssdl|res://*/EDMfweDAL.msl;provider=System.Data.SqlClient;provider connection string="Data Source=SERVER;Initial Catalog=DBDE;Persist Security Info=True;User ID=DB;Password=DBKEY;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
Executando o EXE local funciona perfeitamente, quando coloco ele na rede acontece o erro.
Raphael Pugliesi
- Editado Pugliesi terça-feira, 20 de março de 2012 13:37
-
Olá Raphael,
Quando vc tentar conectar sua aplicação, utilizando esta connection string que esta no App.Config, tudo funciona normalmente?
[]s!
Fernando Henrique Inocêncio Borba Ferreira
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.com/
Twitter: @ferhenrique -
-
Legal,
Estão estamos a caminho da conclusão que o problema é de configuração do servidor ou do SQL...
Pois o nome não esta sendo possível ser resolvido.
Se vc fizer um PING tentando conectar da máquina client no seu servidor funciona?
[]s!
Fernando Henrique Inocêncio Borba Ferreira
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.com/
Twitter: @ferhenrique- Marcado como Resposta Pugliesi quinta-feira, 22 de março de 2012 10:01
-
-
Beleza!
Qualquer coisa é só falar :)
Tamo junto!
[]s!
Fernando Henrique Inocêncio Borba Ferreira
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.com/
Twitter: @ferhenrique