none
Erro Conexão com o Banco de Dados Sql Server RRS feed

  • Pergunta

  • Olá boa tarde!

    Fiz uma sisteminha básico na linguagem C# utilizando o Visual Studio 2008 Professional, juntamente com o banco de Dados SQL Server, no meu notebook utilizo o windows 7 e a seguinte classe de conexão: 

              public static void AbreBanco() 

    {

    string StringConexao = @"Server=.\SQLExpress;AttachDbFilename=C:\Program Files (x86)\Microsoft SQL Server\MSSQL.1\MSSQL\Data\PROCESSO.mdf;Database=PROCESSO; Trusted_Connection=Yes;";
                conn.ConnectionString = StringConexao;
                conn.Open(); 

    }

    Fui então instalar o sistema no computador da pessoa que me pediu ( windows xp), baixei o Sql, fiz o banco de Dados Processo, criei as tabelas e tudo mais e troquei o caminho do banco de dados, então a minha nova conexão ficou:

            public static void AbreBanco()
            {
                string StringConexao = @"Server=.\SQLExpress;AttachDbFilename=C:\Arquivos de programas\Microsoft SQL Server\MSSQL.1\MSSQL\Data\PROCESSO.mdf;Database=PROCESSO; Trusted_Connection=Yes;";
                conn.ConnectionString = StringConexao;
                conn.Open();            
            }

    Só que quando foi rodar o sistema, o mesmo me apresenta o seguinte erro: 

    O banco de dados 'c:\Arquivos de programas\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\PROCESSO.mdf' já existe.
    Não foi possível anexar o arquivo 'C:\Program Files (x86)\Microsoft SQL Server\MSSQL.1\MSSQL\Data\PROCESSO.mdf' como banco de dados 'PROCESSO'.

    Alguém tem ideia do que possa estar acontecendo? Pois não consegui de jeito nenhum fazer ele conectar com o banco de dados.

    Fico no aguardo.


    • Editado Ciskko terça-feira, 21 de agosto de 2012 17:58
    terça-feira, 21 de agosto de 2012 17:09

Respostas

  • Roberson muito obrigado pelas ajudas!

    Eu estava com diversos erros no CrystalReports, devido ao visual studio da máquina cliente não ter esse recurso, então instalei um outro visual que tinha, após abrir e compilar o sistema rodou perfeito!

    Mais agora estou na seguinte questão, essa máquina vai ser o Banco de Dados, e os outros executáveis que acessarem ela, terão que pegar o mesmo banco de dados, mais não tenho a minima ideia de como fazer isso.

    quarta-feira, 22 de agosto de 2012 14:12
  • O "truque" todo está na ConnectionString. Nos terminais/clientes faça assim.

    Server=IPouNomeServidorBancoDados;Database=PROCESSO;User ID=sa;Password=senha;Trusted_Connection=False;

    Nesse site você tem vários exemplos.


    Não esqueça de marcar o post como útil caso tenha te ajudado.

    quarta-feira, 22 de agosto de 2012 14:27

Todas as Respostas

  • Olá...

    Verifique o caminho do arquivo MDF.

    Me parece que você se equivocou ao montar a ConnectionString. Colocou o nome do arquivo 2 vezes.

    string StringConexao = @"Server=.\SQLExpress;AttachDbFilename=C:\Program Files (x86)\Microsoft SQL Server\MSSQL.1\MSSQL\Data\PROCESSO.mdf\PROCESSO.mdf;Database=PROCESSO; Trusted_Connection=Yes;";

    Outra coisa... antes de anexar o banco, verifique se ele já não existe (ou já está anexado) na instância do SQL Server em questão.


    • Sugerido como Resposta CarlosEduardo Ferreira terça-feira, 21 de agosto de 2012 17:47
    • Editado Roberson Naves terça-feira, 21 de agosto de 2012 17:50
    • Marcado como Resposta Ciskko terça-feira, 21 de agosto de 2012 18:40
    • Não Marcado como Resposta Ciskko terça-feira, 21 de agosto de 2012 18:40
    terça-feira, 21 de agosto de 2012 17:45
  • Sobre o nome do arquivo foi um erro de digitação aqui, no caso está correto somente uma vez.

    Sobre a instância do SQL, creio que não pois foi o seguinte desenvolvi o sistema na minha máquina utilizando o caminho string StringConexao = @"Server=.\SQLExpress;AttachDbFilename=C:\Program Files (x86)\Microsoft SQL Server\MSSQL.1\MSSQL\Data\PROCESSO.mdf;Database=PROCESSO; Trusted_Connection=Yes;";

    E hoje quando fui instalar na pessoa que vai utilizar o sistema, instalei tudo novo e fiz um banco de dados novo também tudo do 0, e apenas troquei de C:\Program Files (x86)\Microsoft SQL Server\MSSQL.1\MSSQL\Data\PROCESSO.mdf para C:\Arquivos de programas\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\PROCESSO.mdf

    terça-feira, 21 de agosto de 2012 18:02
  • Vamos lá...

    Pelos caminhos das pastas "Arquivos de Programas", na sua máquina (desenvolvimento) você utiliza Windows 64bit, e na do cliente Windows 32bit. Correto ?

    Só pra garantir, confira se o usuário do serviço do SQL Server tem permissão na pasta  C:\Arquivos de programas\Microsoft SQL Server\MSSQL.1\MSSQL\DATA


    Não esqueça de marcar o post como útil caso tenha te ajudado.

    terça-feira, 21 de agosto de 2012 18:34
  • Exato Roberson, na minha Windows 7 64Bits e na do Cliente Windows XP 32Bits.

    Sim, eu liberei acesso a todas as pastas para todos os usuários da máquina.

    terça-feira, 21 de agosto de 2012 18:41
  • Na máquina do cliente rode essa query:

    SELECT  name ,

            collation_name

    FROM    sys.databases

    WHERE   name NOT IN ( 'master', 'tempdb', 'model', 'msdb' ) ;


    E verifique se sua base (PROCESSO) não aparece no resultado.

    Se aparecer desanexe a base e remova o arquivo.


    Não esqueça de marcar o post como útil caso tenha te ajudado.

    terça-feira, 21 de agosto de 2012 19:01
  • Apareceu a Base sim!

    Como eu faço para desanexar a base e remover o arquivo?

    Desculpe a pergunta, mais não sou muito bom com isso, mecho muito pouco.

    terça-feira, 21 de agosto de 2012 19:58
  • Execute essa query:

    EXEC sp_detach_db 'PROCESSO', 'false'

    E se não for retornado nenhum erro apague o arquivo na pasta.


    Não esqueça de marcar o post como útil caso tenha te ajudado.

    terça-feira, 21 de agosto de 2012 20:08
  • Certo já fiz isso, mais será que o problema está no SQL? O que eu acho estranho no erro no VisualStudio, é que ele indica o caminho ainda da minha máquina, como se tivesse gravado esse caminho como padrão, sendo que eu já troquei na string de conexão esse caminho.
    • Editado Ciskko terça-feira, 21 de agosto de 2012 20:20
    terça-feira, 21 de agosto de 2012 20:16
  • Creio que não...

    Se você rodar essa rotina com a ConnectionString do inicio do thread, o sistema sempre vai tentar anexar o banco à instancia do SQL Server.

    A 1a vez tudo bem.

    Mas na 2a vez o sistema não vai conseguir anexar o arquivo e vai retornar o erro que você se referia, pois o arquivo já existe... e o pior já está anexado.

    Isso tudo por conta do AttachDbFilename.


    Não esqueça de marcar o post como útil caso tenha te ajudado.


    terça-feira, 21 de agosto de 2012 20:26
  • Certo, agora que fiz tudo isso eu crio outro banco? Ou terei de usar outra string de conexão?

    terça-feira, 21 de agosto de 2012 20:27
  • Boas práticas manda o seguinte:

    No seu sistema:

    -Conecte no servidor/instancia no banco MASTER (sua ConnectionString sem o AttachDbFilename e com Database=Master);

    -Roda aquela query que verifica os bancos anexados/online;

    -Se não existir, anexa seu banco (sua ConnectionString);

    -Se existir, conecta no seu banco (sua ConnectionString sem o AttachDbFilename=C:\blablabla).


    Não esqueça de marcar o post como útil caso tenha te ajudado.


    • Editado Roberson Naves quarta-feira, 22 de agosto de 2012 11:21
    • Sugerido como Resposta Roberson Naves quarta-feira, 22 de agosto de 2012 13:06
    terça-feira, 21 de agosto de 2012 20:35
  • Tentei fazer isso mais não consegui ...

    Eu fiz o seguinte teste, criei um novo projeto e criei as mesmas classes e puxei a conexão igualzinho que estava no meu projeto, deu certo ele conectou normalmente.

    Não sei por que parece que o visual gravou um Cache do banco e não muda de jeito nenhum.

    quarta-feira, 22 de agosto de 2012 12:02
  • Não é cache...

    Não tente anexar o banco pela 2a vez. Vai dar erro.


    Não esqueça de marcar o post como útil caso tenha te ajudado.

    quarta-feira, 22 de agosto de 2012 13:06
  • Roberson muito obrigado pelas ajudas!

    Eu estava com diversos erros no CrystalReports, devido ao visual studio da máquina cliente não ter esse recurso, então instalei um outro visual que tinha, após abrir e compilar o sistema rodou perfeito!

    Mais agora estou na seguinte questão, essa máquina vai ser o Banco de Dados, e os outros executáveis que acessarem ela, terão que pegar o mesmo banco de dados, mais não tenho a minima ideia de como fazer isso.

    quarta-feira, 22 de agosto de 2012 14:12
  • O "truque" todo está na ConnectionString. Nos terminais/clientes faça assim.

    Server=IPouNomeServidorBancoDados;Database=PROCESSO;User ID=sa;Password=senha;Trusted_Connection=False;

    Nesse site você tem vários exemplos.


    Não esqueça de marcar o post como útil caso tenha te ajudado.

    quarta-feira, 22 de agosto de 2012 14:27
  • Roberson muitissimo obrigado deu certinho, estou com problema agora na geração do relatório no programa do cliente, ele da a seguinte mensagem:

    Não foi possível carregar arquivo ou assembly 'CrystalDecisions.Windows.Form ...

    Dentro do Instalador eu joguei a pasta Relatorios > Processo.rpt que é o meu arquivo do Crystal Report mais mesmo assim não funcionou.

    sábado, 25 de agosto de 2012 00:04
  • Isso é erro de referencia. No cliente seu sistema não está encontrando o Assembly (DLL) do Crystal.

    Como você está levando essa aplicação pro cliente? Você criou um setup (Project Setup) ?

    Abraço !!


    Não esqueça de marcar o post como útil caso tenha te ajudado.

    sábado, 25 de agosto de 2012 11:34
  • Exato, criei um Project setup e dentro do mesmo coloquei o Processo.rpt que é o meu relatório do CrystalReport.
    domingo, 26 de agosto de 2012 14:39