none
Problemas para acessar o SQL Server via Excel (VBA) RRS feed

  • Pergunta

  • Olá a todos,

    criei uma base no SQL Server, e pretendia acessá-la por meio do Excel usando VBA.

    Tentei acessar de duas formas diferentes e em ambas obtenho erros. 

    A primeira forma é a seguinte

    Sub Acesso()
    
        Dim caminho, provider, userid As String
        Dim sql As String
        caminho = "c:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\base1.mdf"
        Set conexao = New ADODB.Connection
        conexao.provider = "Microsoft.Jet.OLEDB.4.0"
        conexao.ConnectionString = caminho
        conexao.Open
        Set tabela = New ADODB.Recordset
        
    End Sub
    E obtenho o seguinte erro:

    The Microsoft Jet database engine cannot opne the file 'c:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\base1.mdf'
    It is already opened exclusivelu by another user, or you need permission to view its data.


    Procurando em fóruns obtive a seguinte alternativa:

    Sub GetDataFromADO2() 'Declare variables Set objMyConn = New ADODB.Connection Set objMyCmd = New ADODB.Command Set objMyRecordset = New ADODB.Recordset 'Open Connection objMyConn.ConnectionString = "Provider=SQLOLEDB.1;Password=;Persist Security Info=True;User ID= GARDE\gonzalesc;Initial Catalog= c:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\base1.mdf; Data Source=GSAOW028;integrated security=sspi;" objMyConn.Open End Sub

    GARDE\gonzalesc é meu nome de usuário na rede, e foi com ele que criei a base. sou inclusive dbo dessa base, me atribui todas as permissões possíveis.

    Mesmo assim obtenho esse erro.

    Cannot open database 'c:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\base1.mdf'
    requested by the login. The login failed


    Tentei mudar ambos os códigos de várias formas, mas sempre volta uma mensagem de erro, variam um pouco uma da outra, mas sempre focam no mesmo tema, de que não tive o acesso negado.

    Curioso é que eu consigo acessar as tabelas da base pelo Excel, usando o DATA>From SQL Server, e não tenho problema nenhum.... se meu usuário não tivesse acesso não conseguiria fazer isso não?

    Alguém sabe o que tenho q fazer??

    Obrigado!!

    segunda-feira, 27 de janeiro de 2014 16:56

Respostas

  • Carlo,

    Sua 2ª opção de conexão está "quase" correta. Você precisa saber exatamente com o DBA ou responsável pelo seu servidor do banco de dados que você quer acessar qual é o usuário e senha que você pode utilizar para efetuar esta tarefa no Excel.

    Segue abaixo, o seu método de conexão com o trecho destacado, onde você precisa inserir o usuário e senha para acesso:

    Sub GetDataFromADO2()
    
    'Objetos
    Dim oConn as ADODB.Connection
    Set oConn = New ADODB.Connection
    
    'Abrindo a Conexão
    'oConn.ConnectionString = "Provider=SQLNCLI;Server=<SeuServidor>\<SeuInstancia>;Database=<Nome_Logico_do_Banco>;User ID=<USUÁRIO_DO_SQL>;Password=<Sua_senha>"
    
    'Seu objeto vai ficar + ou - assim
    oConn.ConnectionString = "Provider=SQLNCLI;Server=127.0.0.1\SQLExpress;Database=base1;User ID=sa;Password=123456"
    
    oConn.Open
    
    End Sub

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    • Marcado como Resposta Carlo Gonzales segunda-feira, 27 de janeiro de 2014 19:16
    segunda-feira, 27 de janeiro de 2014 17:20
  • Olá Durval!

    Obrigado por ajudar.

    Vou ver com o pessoal do TI onde acho o endereço do servior\instancia.

    Tentei colocar GSAOW de novo e obitive a mensagem: Login failed for user 'gonzalesc', teria outro login que deveria usar? fui que instalei o SQL Server Express na minha máquina, e em nenhum momento criei um usuário... Quando uso SQL Maintenece Server vejo que nos objetos users tem logins como dbo, guest.. e clicando no properties do dbo, o login que aparece é justamente GARDE\gonzalesc...

    Mas vou dar uma olhada melhor aqui!

    Obrigado!



    Carlo,

    No momento da instalação do SQL Express, você pode ter inserido uma senha. Utilize esta senha com o usuário "sa".

    'Faça a conexão local desta forma 
    oConn.ConnectionString = "Provider=SQLNCLI;Server=.\SQLExpress;Database=base1;User ID=sa;Password=<senha_informada_na_instalacao>"
    


    Não esqueça de marcar todos os posts que te ajudaram na solução como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    • Marcado como Resposta Carlo Gonzales segunda-feira, 27 de janeiro de 2014 19:16
    segunda-feira, 27 de janeiro de 2014 18:07
  • Durval,

    3 pontos:

    1) Documentei toda a instalação por meio de screenshots, justamente para se tivesse feito algo assim poder lembrar. E em nenhum momento coloquei senhas. No passo da instalação "Database Engine Configuration" em Authentication mode selecionei 'Windows authentication mode' e em Specify SQL Server administrators selecionei eu, o administrador e alguns membros da minha área.

    Tentei fazer o login com sa e a senha do adminstrador e nada, como meu login e minha senha do windowns e tabmém não, e por fim Administrator ( que é o login do adminstrador) e a senha dele, e nada.
    Tentei os 3 logins acima sem senha e também não obtive sucesso...

    2) Quanto ao server, quando coloco o que você mandou ele carrega por um tempo, e retorna o erro de access denied ou que o server não existe. Quando coloco GSAOW no server, aparece o erro logo em seguida Login failed for user '(aque é qualquer usuário que coloco, sa, gozalesc, Garde\gonzalesc...)',  parece que ele encontra o servidor, tenta fazer o login e é barrado, ao contrário de quando coloco ./SQLExpress, que parece não encontrar o servidor....

    3) Notei que no campo 'Provider' voce coloca SQLNCLI, enquanto eu coloco SQLOLEDB, é alguma diferença de versão do SQL Server? quando coloquei SQLNCLI ocorre o erro de que ele não encontrou o provider...

    Desculpe pelo incomodo e obrigado novamente!!


    Carlo,

    Estou aqui para te ajudar ! Só o "obrigado" com a sua "solução respondida" já vale.

    Como você instalou só "Windows Authentication" eu recomendo você ter um cuidado especial, porque caso mude alguma configuração de seu usuário na rede, seu banco pode ficar inacessível, recomendo que você insira outro usuário da rede ou, se possível, altere o acesso do seu SQL Express para "SQL Authentication".

    No caso do "Windows Authentication", sua string de conexão será um pouco diferente, apenas informando que sua conexão vai obter o usuário logado na máquina. Segue abaixo:

    oConn.ConnectionString = "Provider=SQLNCLI;Server=.\SQLExpress;Database=base1;Trusted_Connection=Yes;"

    Não esqueça de marcar todos os posts que te ajudaram na solução como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    • Editado Durval Ramos segunda-feira, 27 de janeiro de 2014 19:05 Ajuste de informacao
    • Marcado como Resposta Carlo Gonzales segunda-feira, 27 de janeiro de 2014 19:14
    segunda-feira, 27 de janeiro de 2014 19:04
  • Deu certo!!

    A única mudança que fiz foi com relação ao provider e ao server, provicer deixei o que usava e server deixei GSAOW028,  e deu certo!

    Vou implantar as mudanças que você suegeriu!

    Muito obrigado!!!

    ps: Deixei marcado como resposta todas as suas respostas, pois dependendo do problema que a pessoa tiver acho que ela pode usar alguma das outras..
    • Marcado como Resposta Carlo Gonzales segunda-feira, 27 de janeiro de 2014 19:16
    • Editado Carlo Gonzales segunda-feira, 27 de janeiro de 2014 19:17
    segunda-feira, 27 de janeiro de 2014 19:15

Todas as Respostas

  • Carlos,

    Boa tarde,

    Se você esta usando seu usuário do windows, basta colocar a string abaixo, que já vai utilizar seu usuário.

    Provider=SQLOLEDB;Data Source=ServerIPOrName;Initial Catalog=DatabaseName;Trusted_connection=yes;

    Boa sorte,

    AT_+

    segunda-feira, 27 de janeiro de 2014 17:11
  • Olá Alexandre!

    obrigado pela ajuda,

    porém continuo apresentando mensagens de erro,

    Cannot open database 'c:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\base1.mdf'
    requested by the login. The login failed

    Será que tenho que mudar alguma coisa no SQL Server?

    Obrigado!

    segunda-feira, 27 de janeiro de 2014 17:18
  • Carlo,

    Sua 2ª opção de conexão está "quase" correta. Você precisa saber exatamente com o DBA ou responsável pelo seu servidor do banco de dados que você quer acessar qual é o usuário e senha que você pode utilizar para efetuar esta tarefa no Excel.

    Segue abaixo, o seu método de conexão com o trecho destacado, onde você precisa inserir o usuário e senha para acesso:

    Sub GetDataFromADO2()
    
    'Objetos
    Dim oConn as ADODB.Connection
    Set oConn = New ADODB.Connection
    
    'Abrindo a Conexão
    'oConn.ConnectionString = "Provider=SQLNCLI;Server=<SeuServidor>\<SeuInstancia>;Database=<Nome_Logico_do_Banco>;User ID=<USUÁRIO_DO_SQL>;Password=<Sua_senha>"
    
    'Seu objeto vai ficar + ou - assim
    oConn.ConnectionString = "Provider=SQLNCLI;Server=127.0.0.1\SQLExpress;Database=base1;User ID=sa;Password=123456"
    
    oConn.Open
    
    End Sub

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    • Marcado como Resposta Carlo Gonzales segunda-feira, 27 de janeiro de 2014 19:16
    segunda-feira, 27 de janeiro de 2014 17:20
  • Olá Durval!

    Obrigado por ajudar.

    Vou ver com o pessoal do TI onde acho o endereço do servior\instancia.

    Tentei colocar GSAOW de novo e obitive a mensagem: Login failed for user 'gonzalesc', teria outro login que deveria usar? fui que instalei o SQL Server Express na minha máquina, e em nenhum momento criei um usuário... Quando uso SQL Maintenece Server vejo que nos objetos users tem logins como dbo, guest.. e clicando no properties do dbo, o login que aparece é justamente GARDE\gonzalesc...

    Mas vou dar uma olhada melhor aqui!

    Obrigado!



    segunda-feira, 27 de janeiro de 2014 17:55
  • Olá Durval!

    Obrigado por ajudar.

    Vou ver com o pessoal do TI onde acho o endereço do servior\instancia.

    Tentei colocar GSAOW de novo e obitive a mensagem: Login failed for user 'gonzalesc', teria outro login que deveria usar? fui que instalei o SQL Server Express na minha máquina, e em nenhum momento criei um usuário... Quando uso SQL Maintenece Server vejo que nos objetos users tem logins como dbo, guest.. e clicando no properties do dbo, o login que aparece é justamente GARDE\gonzalesc...

    Mas vou dar uma olhada melhor aqui!

    Obrigado!



    Carlo,

    No momento da instalação do SQL Express, você pode ter inserido uma senha. Utilize esta senha com o usuário "sa".

    'Faça a conexão local desta forma 
    oConn.ConnectionString = "Provider=SQLNCLI;Server=.\SQLExpress;Database=base1;User ID=sa;Password=<senha_informada_na_instalacao>"
    


    Não esqueça de marcar todos os posts que te ajudaram na solução como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    • Marcado como Resposta Carlo Gonzales segunda-feira, 27 de janeiro de 2014 19:16
    segunda-feira, 27 de janeiro de 2014 18:07
  • Durval,

    3 pontos:

    1) Documentei toda a instalação por meio de screenshots, justamente para se tivesse feito algo assim poder lembrar. E em nenhum momento coloquei senhas. No passo da instalação "Database Engine Configuration" em Authentication mode selecionei 'Windows authentication mode' e em Specify SQL Server administrators selecionei eu, o administrador e alguns membros da minha área.

    Tentei fazer o login com sa e a senha do adminstrador e nada, como meu login e minha senha do windowns e tabmém não, e por fim Administrator ( que é o login do adminstrador) e a senha dele, e nada.
    Tentei os 3 logins acima sem senha e também não obtive sucesso...

    2) Quanto ao server, quando coloco o que você mandou ele carrega por um tempo, e retorna o erro de access denied ou que o server não existe. Quando coloco GSAOW no server, aparece o erro logo em seguida Login failed for user '(aque é qualquer usuário que coloco, sa, gozalesc, Garde\gonzalesc...)',  parece que ele encontra o servidor, tenta fazer o login e é barrado, ao contrário de quando coloco ./SQLExpress, que parece não encontrar o servidor....

    3) Notei que no campo 'Provider' voce coloca SQLNCLI, enquanto eu coloco SQLOLEDB, é alguma diferença de versão do SQL Server? quando coloquei SQLNCLI ocorre o erro de que ele não encontrou o provider...

    Desculpe pelo incomodo e obrigado novamente!!


    segunda-feira, 27 de janeiro de 2014 18:49
  • Durval,

    3 pontos:

    1) Documentei toda a instalação por meio de screenshots, justamente para se tivesse feito algo assim poder lembrar. E em nenhum momento coloquei senhas. No passo da instalação "Database Engine Configuration" em Authentication mode selecionei 'Windows authentication mode' e em Specify SQL Server administrators selecionei eu, o administrador e alguns membros da minha área.

    Tentei fazer o login com sa e a senha do adminstrador e nada, como meu login e minha senha do windowns e tabmém não, e por fim Administrator ( que é o login do adminstrador) e a senha dele, e nada.
    Tentei os 3 logins acima sem senha e também não obtive sucesso...

    2) Quanto ao server, quando coloco o que você mandou ele carrega por um tempo, e retorna o erro de access denied ou que o server não existe. Quando coloco GSAOW no server, aparece o erro logo em seguida Login failed for user '(aque é qualquer usuário que coloco, sa, gozalesc, Garde\gonzalesc...)',  parece que ele encontra o servidor, tenta fazer o login e é barrado, ao contrário de quando coloco ./SQLExpress, que parece não encontrar o servidor....

    3) Notei que no campo 'Provider' voce coloca SQLNCLI, enquanto eu coloco SQLOLEDB, é alguma diferença de versão do SQL Server? quando coloquei SQLNCLI ocorre o erro de que ele não encontrou o provider...

    Desculpe pelo incomodo e obrigado novamente!!


    Carlo,

    Estou aqui para te ajudar ! Só o "obrigado" com a sua "solução respondida" já vale.

    Como você instalou só "Windows Authentication" eu recomendo você ter um cuidado especial, porque caso mude alguma configuração de seu usuário na rede, seu banco pode ficar inacessível, recomendo que você insira outro usuário da rede ou, se possível, altere o acesso do seu SQL Express para "SQL Authentication".

    No caso do "Windows Authentication", sua string de conexão será um pouco diferente, apenas informando que sua conexão vai obter o usuário logado na máquina. Segue abaixo:

    oConn.ConnectionString = "Provider=SQLNCLI;Server=.\SQLExpress;Database=base1;Trusted_Connection=Yes;"

    Não esqueça de marcar todos os posts que te ajudaram na solução como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    • Editado Durval Ramos segunda-feira, 27 de janeiro de 2014 19:05 Ajuste de informacao
    • Marcado como Resposta Carlo Gonzales segunda-feira, 27 de janeiro de 2014 19:14
    segunda-feira, 27 de janeiro de 2014 19:04
  • Deu certo!!

    A única mudança que fiz foi com relação ao provider e ao server, provicer deixei o que usava e server deixei GSAOW028,  e deu certo!

    Vou implantar as mudanças que você suegeriu!

    Muito obrigado!!!

    ps: Deixei marcado como resposta todas as suas respostas, pois dependendo do problema que a pessoa tiver acho que ela pode usar alguma das outras..
    • Marcado como Resposta Carlo Gonzales segunda-feira, 27 de janeiro de 2014 19:16
    • Editado Carlo Gonzales segunda-feira, 27 de janeiro de 2014 19:17
    segunda-feira, 27 de janeiro de 2014 19:15