Erro de conexão com Windows 7
Olá.
Utilizo Delphi 7. Tenho uma aplicação funcionando perfeitamente em Windows XP e inferiores acessando Windows Server 2003 com Sql Server 2005.
Esta mesma aplicação, quando instalada em Windows Vista ou 7 não consegue logar-se ao servidor.
Vejamos:
1 - Ao iniciar o sistema utilizo um componente adoConnection ( conTestaConexao ) o qual recebe em tempo de execução as configurações de acesso ao banco, por meio de sua propriedade ConnectionString. Ex.: Provider=SQLOLEDB.1;Password=SENHA;User ID=USUARIO;Initial Catalog=MINHABASE;Data Source=192.168.1.1
Após preencher a propriedade ConnectionString faço um Open. Caso haja algum erro interrompo a execução do sistema, informando ao usuário a impossibilidade e disponibilizo uma tela para que configure a conexão outra vez.
Nesta tela o usuário tem a possibilidade de testar os dados entrados e verificar se a conexão obterá êxito e, somente nesta hipótese, as informações são salvas para serem utilizadas em conexões futuras.
Até aqui tudo vai bem.
2 - Um segundo adoConnection ( adoCon ) tem sua propriedade ConnectionString alimentada pela ConnectionString do primeiro adoConnection ( conTestaConexao ).
Deste ponto em diante todos os componentes ADOQuery, ADOCommand e etc. têm suas propriedades Connection apontadas para o ADOConnection ( adoCon ).
Aqui ocorre o problema. Sem exceção, quaisquer Query, Command e etc. não são executadas e, o sistema detecta o erro: "Login failed for user 'USUARIO'".
Abaixo uma transcrição do Código:
1 - TESTA PARAMETROS DE CONEXAO
Procedure DefineNovoServidor(iTipo : Integer; sProvider, sSenha, sUsuario, sBanco, sServidor : String);
Begin
sCon := 'Provider=' + sProvider;
Case iTipo Of
0 : //Sql Server
Begin
sCon := sCon + ';Password=' + sSenha;
sCon := sCon + ';User ID=';
sCon := sCon + sUsuario;
sCon := sCon + ';Initial Catalog=' + sBanco;
sCon := sCon + ';Data Source=' + sServidor;
End;
End;
End; Function ConexaoOk : Boolean;
Begin
Result := True;
Screen.Cursor := crHourGlass;
With DmGeral.conTestaConexao Do
Begin
ConnectionString := sCon;
Close;
Try
Open;
Close;
Except
On e : Exception Do
Begin
MensagemDeAviso( 'Sistema não foi capaz de realizar um teste de conexão' +
': "' + e.Message + '".' );
Result := False;
End;
End;
End;
Screen.Cursor := crDefault;
End;
2 - CONFIGURAÇÃO VÁLIDA É PASSADA AO SEGUNDO ADOCONNECTION. AS QUERYS, SPs E COMMANDS TÊM SUAS PROPRIEDADES CONNECTION PREENCHIDAS. UMA QUERY SENDO DISPARADA. Procedure AtribuiStringDeConexao;
Var
i : Integer;
Begin
//Atribui a nova string de conexão ao objeto principal de conexão
DmGeral.adoCon.Close;
DmGeral.adoCon.ConnectionString := sCon; Screen.Cursor := crHourGlass;
Try
For i := 0 To DmGeral.ComponentCount - 1 Do
Begin
If (DmGeral.Components[i] is TADOQuery) Then
(DmGeral.Components[i] as TADOQuery).Connection := DmGeral.adoCon;
If (DmGeral.Components[i] is TADOStoredProc) Then
(DmGeral.Components[i] as TADOStoredProc).Connection := DmGeral.adoCon;
If (DmGeral.Components[i] is TADOCommand) Then
(DmGeral.Components[i] as TADOCommand).Connection := DMGeral.adoCon;
End;
For i := 0 To DMEstoque.ComponentCount - 1 Do
Begin
If (DMEstoque.Components[i] is TADOQuery) Then
(DMEstoque.Components[i] as TADOQuery).Connection := DMGeral.adoCon;
If (DMEstoque.Components[i] is TADOStoredProc) Then
(DMEstoque.Components[i] as TADOStoredProc).Connection := DMGeral.adoCon;
If (DMEstoque.Components[i] is TADOCommand) Then
(DMEstoque.Components[i] as TADOCommand).Connection := DMGeral.adoCon;
End;
Finally
Screen.Cursor := crDefault;
End;
End; Function ObtemNomeDoUsuarioLogadoNoMomento( sAplicacao : String; Var cdUsuario : Smallint ) : String;
Var
qryLocal : TADOQuery;
sScriptParaAR : String;
Begin
Result := '';
qryLocal := TADOQuery.Create( Nil );
Try
Screen.Cursor := crHourGlass;
Progresso( 'Identificando usuário...', 1 );
If UpperCase( sAplicacao ) = 'APLICACAO' Then
Begin
sScriptParaAR :=
'Select ' +
' * ' +
'From ' +
' [Log] As l ' +
'Where ' +
' l.nmComputador = ' + QuotedStr( UpperCase( ObtemNomeDoComputador ) ) + ' ' +
' And l.chOpcao = ' + QuotedStr( 'ENTRADA NO SISTEMA' ) + ' ' +
' And Not Exists ( ' +
' Select Top 1 ' +
' 1 ' +
' From ' +
' [Log] As lg ' +
' Where ' +
' lg.nmComputador = l.nmComputador ' +
' And lg.chOpcao = ' + QuotedStr( 'SAIDA DO SISTEMA' ) + ' ' +
' And lg.DtLog > l.DtLog ' +
' ) ' +
'Order By ' +
' l.DtLog Desc ';
Try
With qryLocal Do
Begin
Connection := DmGeral.adoCon;
CommandTimeout := 36000;
Sql.Add( sScriptParaAR );
Open;
If Not IsEmpty Then
Begin
cdUsuario := FieldByName( 'cdUsuario' ).AsInteger;
Result := FieldByName( 'NmCompletoUsuario' ).AsString;
End;
End;
Except
On e : Exception Do
Begin
MensagemDeAviso( 'Não foi possível obter usuário logado no momento: "' + e.Message + '".' );
End;
End;
End;
Progresso;
Finally
Progresso( 'Identificando usuário...', 1, False );
Screen.Cursor := crDefault;
FreeAndNil( qryLocal );
End;
End;
Desde já muito obrigado pela atenção de todos.
Begin
sCon := 'Provider=' + sProvider;
Case iTipo Of
0 : //Sql Server
Begin
sCon := sCon + ';Password=' + sSenha;
sCon := sCon + ';User ID=';
sCon := sCon + sUsuario;
sCon := sCon + ';Initial Catalog=' + sBanco;
sCon := sCon + ';Data Source=' + sServidor;
End;
End;
End; Function ConexaoOk : Boolean;
Begin
Result := True;
Screen.Cursor := crHourGlass;
With DmGeral.conTestaConexao Do
Begin
ConnectionString := sCon;
Close;
Try
Open;
Close;
Except
On e : Exception Do
Begin
MensagemDeAviso( 'Sistema não foi capaz de realizar um teste de conexão' +
': "' + e.Message + '".' );
Result := False;
End;
End;
End;
Screen.Cursor := crDefault;
End;
2 - CONFIGURAÇÃO VÁLIDA É PASSADA AO SEGUNDO ADOCONNECTION. AS QUERYS, SPs E COMMANDS TÊM SUAS PROPRIEDADES CONNECTION PREENCHIDAS. UMA QUERY SENDO DISPARADA. Procedure AtribuiStringDeConexao;
Var
i : Integer;
Begin
//Atribui a nova string de conexão ao objeto principal de conexão
DmGeral.adoCon.Close;
DmGeral.adoCon.ConnectionString := sCon; Screen.Cursor := crHourGlass;
Try
For i := 0 To DmGeral.ComponentCount - 1 Do
Begin
If (DmGeral.Components[i] is TADOQuery) Then
(DmGeral.Components[i] as TADOQuery).Connection := DmGeral.adoCon;
If (DmGeral.Components[i] is TADOStoredProc) Then
(DmGeral.Components[i] as TADOStoredProc).Connection := DmGeral.adoCon;
If (DmGeral.Components[i] is TADOCommand) Then
(DmGeral.Components[i] as TADOCommand).Connection := DMGeral.adoCon;
End;
For i := 0 To DMEstoque.ComponentCount - 1 Do
Begin
If (DMEstoque.Components[i] is TADOQuery) Then
(DMEstoque.Components[i] as TADOQuery).Connection := DMGeral.adoCon;
If (DMEstoque.Components[i] is TADOStoredProc) Then
(DMEstoque.Components[i] as TADOStoredProc).Connection := DMGeral.adoCon;
If (DMEstoque.Components[i] is TADOCommand) Then
(DMEstoque.Components[i] as TADOCommand).Connection := DMGeral.adoCon;
End;
Finally
Screen.Cursor := crDefault;
End;
End; Function ObtemNomeDoUsuarioLogadoNoMomento( sAplicacao : String; Var cdUsuario : Smallint ) : String;
Var
qryLocal : TADOQuery;
sScriptParaAR : String;
Begin
Result := '';
qryLocal := TADOQuery.Create( Nil );
Try
Screen.Cursor := crHourGlass;
Progresso( 'Identificando usuário...', 1 );
If UpperCase( sAplicacao ) = 'APLICACAO' Then
Begin
sScriptParaAR :=
'Select ' +
' * ' +
'From ' +
' [Log] As l ' +
'Where ' +
' l.nmComputador = ' + QuotedStr( UpperCase( ObtemNomeDoComputador ) ) + ' ' +
' And l.chOpcao = ' + QuotedStr( 'ENTRADA NO SISTEMA' ) + ' ' +
' And Not Exists ( ' +
' Select Top 1 ' +
' 1 ' +
' From ' +
' [Log] As lg ' +
' Where ' +
' lg.nmComputador = l.nmComputador ' +
' And lg.chOpcao = ' + QuotedStr( 'SAIDA DO SISTEMA' ) + ' ' +
' And lg.DtLog > l.DtLog ' +
' ) ' +
'Order By ' +
' l.DtLog Desc ';
Try
With qryLocal Do
Begin
Connection := DmGeral.adoCon;
CommandTimeout := 36000;
Sql.Add( sScriptParaAR );
Open;
If Not IsEmpty Then
Begin
cdUsuario := FieldByName( 'cdUsuario' ).AsInteger;
Result := FieldByName( 'NmCompletoUsuario' ).AsString;
End;
End;
Except
On e : Exception Do
Begin
MensagemDeAviso( 'Não foi possível obter usuário logado no momento: "' + e.Message + '".' );
End;
End;
End;
Progresso;
Finally
Progresso( 'Identificando usuário...', 1, False );
Screen.Cursor := crDefault;
FreeAndNil( qryLocal );
End;
End;
Desde já muito obrigado pela atenção de todos.
Marcio Santos
Curtidas 0
Respostas
Marcio Santos
20/05/2010
Ih... acho que a questão é mesmo delicada... Alguém se candidata a me ajudar? Será que ninguém nunca passou por esta situação?
Mais uma vez, obrigado a todos e, fico no aguardo!
GOSTEI 0
Marcio Santos
20/05/2010
Será que alguém já tem alguma idéia a respeito? Já pensei em particularidades para conexão entre Windows Vista/7 x Windows Server 2003 x Sql Server 2005. Por acaso alguém tem conhecimento de que haja atualização da MIDAS.DLL para W Vista/7???????
Acho que estou mesmo enrroscado!!!!!
GOSTEI 0
Ronaldo Barros
20/05/2010
Acabei de pegar está situação igual a sua. :(
vc conseguiu resolver? se sim passa a dica ai.
Grato!
vc conseguiu resolver? se sim passa a dica ai.
Grato!
GOSTEI 0
Manoel Jr
20/05/2010
A sua base de dados está na mesma máquina que você está rodando ou está em outra máquina da rede??
Tanto o Windows Vista Como O Windows 7 não permitem conexão a banco de dados localmente, se for usar localmente vc tem que usar o ip 127.0.0.1 ou localhost. se não a conexão não acontecerá.
Tanto o Windows Vista Como O Windows 7 não permitem conexão a banco de dados localmente, se for usar localmente vc tem que usar o ip 127.0.0.1 ou localhost. se não a conexão não acontecerá.
GOSTEI 0
Marcio Santos
20/05/2010
Prezados,
Desculpem por não ter postado a solução encontrada - na verdade, a resposta a percepção que obtive.
Como podem ter notado o post é bastante antigo e, em função de não ter obtido uma resposta junto aos amigos à época, encontrei a solução de forma bastante empírica. Falha minha não ter compartilhado os experimentos e solução adotada. Peço perdão mais uma vez.
Vamos por parte, então:
1 - Quanto a afirmação de nosso amigo Manoel, creio haver um equívoco - por favor, não me entenda mal, pois meu desejo é tão somente contribuir com a comunidade, compartilhando minhas experiências. No acesso local, é possível sim estabelecer uma conexão ao servidor MS SQL sem lançar mão exclusivamente de localhost ou do IP 127.0.0.1. Realizei, desde então, testes com as versões 2000, 2005, 2008 e 2008r2, utilizando o endereço IP do equipamento ou o nome do equipamento seguido ou não do nome da instância - VERIFIQUE AS CONFIGURAÇÕES DO MS SQL SERVER ATRAVÉS DE SUA FERRAMENTA SQL SERVER CONFIGURATION MANAGER, verificando se os protocolos pipes nomeados e tcp/ip estão devidamente configurados;
2 - Quanto a conexão remota, as experiências levaram-me a uma solução muito, muito, muito, mas muito simples mesmo: utilizei senha composta, exclusivamente, por letras maiúsculas ou exclusivamente por letras minúsculas - podendo conter números também.
Explicação: Por alguma razão que depois não procurei saber, pois tinha que entregar o produto rapidamente ao cliente, os Windows Vista ou Sete, interpretavam/enviavam a cadeia de caracteres que continham maiúsculos e minúsculos de uma maneira que o servidor não compreendia como sendo a senha correta.
ex.: usuário: sa senha: Adventista
Falha na conexão
ex.: usuário: sa senha: ADVENTISTA
Conexão realizada com sucesso
ex.: usuário: sa senha: adventista
Conexão realizada com sucesso
ex.: usuário: sa senha:AD98VENDISTA
Conexão realizada com sucesso
ex.: usuário: sa senha:ad98vendista
Conexão realizada com sucesso
ex.: usuário: sa senha: Ad98ventista
Falha na conexão.
O que é curioso é que se o cliente fosse um Windows XP não fazia diferença alguma, a conexão era restabelecida com sucesso.
O Windows Vista e o Windows Sete obrigaram-me, então, a configurar a senha sempre maiúscula ou sempre minúscula.
Cordialmente,
Abraços!
Desculpem por não ter postado a solução encontrada - na verdade, a resposta a percepção que obtive.
Como podem ter notado o post é bastante antigo e, em função de não ter obtido uma resposta junto aos amigos à época, encontrei a solução de forma bastante empírica. Falha minha não ter compartilhado os experimentos e solução adotada. Peço perdão mais uma vez.
Vamos por parte, então:
1 - Quanto a afirmação de nosso amigo Manoel, creio haver um equívoco - por favor, não me entenda mal, pois meu desejo é tão somente contribuir com a comunidade, compartilhando minhas experiências. No acesso local, é possível sim estabelecer uma conexão ao servidor MS SQL sem lançar mão exclusivamente de localhost ou do IP 127.0.0.1. Realizei, desde então, testes com as versões 2000, 2005, 2008 e 2008r2, utilizando o endereço IP do equipamento ou o nome do equipamento seguido ou não do nome da instância - VERIFIQUE AS CONFIGURAÇÕES DO MS SQL SERVER ATRAVÉS DE SUA FERRAMENTA SQL SERVER CONFIGURATION MANAGER, verificando se os protocolos pipes nomeados e tcp/ip estão devidamente configurados;
2 - Quanto a conexão remota, as experiências levaram-me a uma solução muito, muito, muito, mas muito simples mesmo: utilizei senha composta, exclusivamente, por letras maiúsculas ou exclusivamente por letras minúsculas - podendo conter números também.
Explicação: Por alguma razão que depois não procurei saber, pois tinha que entregar o produto rapidamente ao cliente, os Windows Vista ou Sete, interpretavam/enviavam a cadeia de caracteres que continham maiúsculos e minúsculos de uma maneira que o servidor não compreendia como sendo a senha correta.
ex.: usuário: sa senha: Adventista
Falha na conexão
ex.: usuário: sa senha: ADVENTISTA
Conexão realizada com sucesso
ex.: usuário: sa senha: adventista
Conexão realizada com sucesso
ex.: usuário: sa senha:AD98VENDISTA
Conexão realizada com sucesso
ex.: usuário: sa senha:ad98vendista
Conexão realizada com sucesso
ex.: usuário: sa senha: Ad98ventista
Falha na conexão.
O que é curioso é que se o cliente fosse um Windows XP não fazia diferença alguma, a conexão era restabelecida com sucesso.
O Windows Vista e o Windows Sete obrigaram-me, então, a configurar a senha sempre maiúscula ou sempre minúscula.
Cordialmente,
Abraços!
GOSTEI 0