none
Como construir uma conexão com Entity Framework em "runt-time" RRS feed

  • 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

    terça-feira, 20 de março de 2012 11:13

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
    terça-feira, 20 de março de 2012 14:08
    Moderador

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

    terça-feira, 20 de março de 2012 12:20
    Moderador
  • Olá Fernando, Muito obrigado por sua resposta.

    Eu gostaria de fazer a conexão com o SQL Server mesmo e preciso passar para essa função o usuário e senha do banco de dados...

    att,


    Raphael Pugliesi

    terça-feira, 20 de março de 2012 12:28
  • 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

    terça-feira, 20 de março de 2012 12:37
    Moderador
  • A aplicação é Local...


    Raphael Pugliesi

    terça-feira, 20 de março de 2012 12:40
  • 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

    terça-feira, 20 de março de 2012 12:41
    Moderador
  • 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

    terça-feira, 20 de março de 2012 13:05
  • 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

    terça-feira, 20 de março de 2012 13:05
  • 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

    terça-feira, 20 de março de 2012 13:29
    Moderador
  • 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=&quot;Data Source=SERVER;Initial Catalog=DBDE;Persist Security Info=True;User ID=DB;Password=DBKEY;MultipleActiveResultSets=True&quot;" 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
    terça-feira, 20 de março de 2012 13:36
  • 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

    terça-feira, 20 de março de 2012 13:59
    Moderador
  • Fernando,

    De qualquer forma (App.config ou com o método que você me passou), quando o EXE está local, funciona. Se eu coloco a aplicação no meu servidor e executo, aparece o erro...

    []


    Raphael Pugliesi

    terça-feira, 20 de março de 2012 14:05
  • 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
    terça-feira, 20 de março de 2012 14:08
    Moderador
  • Fernando,

    A autenticação estava acontecendo com um nome de servidor diferente do que estava na string de conexão, portanto não funcionava o acesso.

    Obrigado por ajudar


    Raphael 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

    quinta-feira, 22 de março de 2012 11:44
    Moderador