CRIA?ÃO ODBC VIA CÓDIGO NÃO FUNCIONA NO WIN8 E 10
Agradeço por alguma colaboração.
A Rotina que tenho, checa se a fonte existe, senão a cria via código VB. Até o Win7 funciona ok, mas quando o ambiente é win8 ou 10, tenho de criar na unha porque não cria mais nestes ambientes.
Obs. Acabei de executar o sistema num Win10 e gerou a odbc normalmente. A coisa está intermitente!
Rotina:
Private Sub Cria_DSN()
Dim DataSourceName As String
Dim DatabaseName As String
Dim Description As String
Dim DriverPath As String
Dim DriverName As String
Dim Regional As String
Dim Server As String
Dim lResult As Long
Dim hKeyHandle As Long
[ô]Specify the DSN parameters.
DataSourceName = [Ô]MinaODBC[Ô]
DatabaseName = [Ô]MeuBD[Ô]
Description = [Ô]Orcamento/Compras/Contabilidade[Ô]
DriverPath = [Ô]C:\Windows\System32[Ô]
Server = gLocalBD
DriverName = [Ô]SQL Server[Ô]
[ô]Create the new DSN key.
lResult = RegCreateKey(HKEY_LOCAL_MACHINE, [Ô]SOFTWARE\ODBC\ODBC.INI\[Ô] & _
DataSourceName, hKeyHandle)
[ô]Set the values of the new DSN key.
lResult = RegSetValueEx(hKeyHandle, [Ô]Database[Ô], 0&, REG_SZ, _
ByVal DatabaseName, Len(DatabaseName))
lResult = RegSetValueEx(hKeyHandle, [Ô]Description[Ô], 0&, REG_SZ, _
ByVal Description, Len(Description))
lResult = RegSetValueEx(hKeyHandle, [Ô]Driver[Ô], 0&, REG_SZ, _
ByVal DriverPath, Len(DriverPath))
lResult = RegSetValueEx(hKeyHandle, [Ô]LastUser[Ô], 0&, REG_SZ, _
ByVal LastUser, Len(LastUser))
lResult = RegSetValueEx(hKeyHandle, [Ô]Server[Ô], 0&, REG_SZ, _
ByVal Server, Len(Server))
[ô]Close the new DSN key.
lResult = RegCloseKey(hKeyHandle)
[ô]Open ODBC Data Sources key to list the new DSN in the ODBC Manager.
[ô]Specify the new value.
[ô]Close the key.
lResult = RegCreateKey(HKEY_LOCAL_MACHINE, _
[Ô]SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources[Ô], hKeyHandle)
lResult = RegSetValueEx(hKeyHandle, DataSourceName, 0&, REG_SZ, _
ByVal DriverName, Len(DriverName))
lResult = RegCloseKey(hKeyHandle)
End Sub
porém preciso disso e pode ser em vb6, .bat , C#, .net qualquer coisa..
O Ideal é por OleDB, mas se desejam criar por .bat, pode ser assim:
strLinhaDeComando = [Ô]%windir%\system32\odbcconf.exe /a {CONFIGSYSDSN [Ô] & [Ô][Ô][Ô][Ô] & [Ô]PostgreSQL Unicode[Ô] & [Ô][Ô][Ô][Ô] & [Ô] [Ô] & [Ô][Ô][Ô][Ô] & [Ô]DSN=NomeDaBaseDados & [Ô]|Description=ConexaoComodoro|SERVERNAME=[Ô] & fnc_IP_do_Servidor_Local & [Ô]|PORT=5432|DATABASE=[Ô] & NomeDaBaseDados & [Ô]|UID=[Ô] & UsuarioDoBancoDeDados & [Ô]|PWD=[Ô] & SenhaDoBancoDeDados & [Ô][Ô][Ô][Ô] & [Ô]}[Ô]
No exemplo acima é para PostGreSQL. Basta substituir para o nome do driver do banco de dados usado, logo após o CONFIGSYSDSN.
Se for para criar em ambientes 64 bits, o comando é o mesmo, apenas trocando \system32 por \syswow64.
Grave a linha acima em um .bat (algo como print #10, strLinhaDeComando) e executa o .bat com Shell.
O comando acima ainda é usado em uma aplicação VB6 legada. Funciona 100% em Windows 7, Windows 8, Windows 8.1 e Windows 10.
Tudo de bom.
Citação::
Bem, colegas...
O Ideal é por OleDB, mas se desejam criar por .bat, pode ser assim:
strLinhaDeComando = [Ô]%windir%system32odbcconf.exe /a {CONFIGSYSDSN [Ô] & [Ô][Ô][Ô][Ô] & [Ô]PostgreSQL Unicode[Ô] & [Ô][Ô][Ô][Ô] & [Ô] [Ô] & [Ô][Ô][Ô][Ô] & [Ô]DSN=NomeDaBaseDados & [Ô]|Description=ConexaoComodoro|SERVERNAME=[Ô] & fnc_IP_do_Servidor_Local & [Ô]|PORT=5432|DATABASE=[Ô] & NomeDaBaseDados & [Ô]|UID=[Ô] & UsuarioDoBancoDeDados & [Ô]|PWD=[Ô] & SenhaDoBancoDeDados & [Ô][Ô][Ô][Ô] & [Ô]}[Ô]
No exemplo acima é para PostGreSQL. Basta substituir para o nome do driver do banco de dados usado, logo após o CONFIGSYSDSN.
Se for para criar em ambientes 64 bits, o comando é o mesmo, apenas trocando system32 por syswow64.
Grave a linha acima em um .bat (algo como print #10, strLinhaDeComando) e executa o .bat com Shell.
O comando acima ainda é usado em uma aplicação VB6 legada. Funciona 100% em Windows 7, Windows 8, Windows 8.1 e Windows 10.
Tudo de bom.
Não entendi é pra colocar isso num .bat e chamar por Shell o .bat?
strLinhaDeComando = [Ô]%windir%\system32\odbcad32.exe /a {CONFIGSYSDSN [Ô] & [Ô][Ô][Ô][Ô] & [Ô]MySQL[Ô] & [Ô][Ô][Ô][Ô] & [Ô] [Ô] & [Ô][Ô][Ô][Ô] & [Ô]DSN=NomeDaBaseDados & [Ô]|Description=ConexaoComodoro|SERVERNAME=[Ô] & fnc_IP_do_Servidor_Local & [Ô]|PORT=5432|DATABASE=[Ô] & NomeDaBaseDados & [Ô]|UID=[Ô] & UsuarioDoBancoDeDados & [Ô]|PWD=[Ô] & SenhaDoBancoDeDados & [Ô][Ô][Ô][Ô] & [Ô]}[Ô]
Sim, é para colocar em um .bat e chamar com shell.
Mas veja que a construção do .bat eu fiz dentro do próprio sistema, ou seja, coloquei em uma variável o comando completo a ser inserido dentro do .bat.
Na criação do comando coloquei o IP do servidor, nome do usuário, senha, etc,
Depois gravo o conteúdo da variável em algo como [Ô]odbc.bat[Ô] e executo com shell.
Tudo de bom.
Citação::
Colega MESTRE,
Sim, é para colocar em um .bat e chamar com shell.
Mas veja que a construção do .bat eu fiz dentro do próprio sistema, ou seja, coloquei em uma variável o comando completo a ser inserido dentro do .bat.
Na criação do comando coloquei o IP do servidor, nome do usuário, senha, etc,
Depois gravo o conteúdo da variável em algo como [Ô]odbc.bat[Ô] e executo com shell.
Tudo de bom.
Teria como me mandar o exemplo? eu tentei aqui porem acho que falta alguma [Ô]referencia[Ô] no Vb6 ou algo do tipo como (using C# , Imports VB.NET)...
De fato, como eu mesmo tinha dito acima, o melhor é OleDB. Concordo contigo.
Colega MESTRE,
Código completo em VB6 (mas a lógica para criar o .bat seria a mesma no .Net, contudo, recomenda-se sempre o OleDB). Eu uso uma função chamada fnc_Pasta_Existe que verifica se uma pasta existe (system32, syswow64, etc), que você poderá criar ou retirar do código. O .bat estou gravando em uma subpasta chamada 99-Temp do aplicativo, mas você poderá mudar para a pasta que desejar. Estou usando para PostGreSQL. Mude [Ô]PostGreSQL Unicode[Ô] para o nome do seu driver (SQL Server ou qualquer outro. Veja manualmente na criação do ODBC qual é o nome correto do seu driver):
[ô]--------------------------------
[ô] !
[ô] !
[ô] CRIAR ODBC !
[ô] !
[ô] !
[ô]--------------------------------
[ô]Formar nomes de comandos .bat
strNomeSysBat = [Ô]sys01.bat[Ô]
strNomeWowBat = [Ô]wow01.bat[Ô]
[ô]--------------------
[ô] !
[ô] ODBC SYSTEM32 !
[ô] !
[ô]--------------------
[ô]Somente se a pasta existir
If fnc_Pasta_Existe(Environ([Ô]SYSTEMROOT[Ô]) & [Ô]\system32\[Ô]) Then
[ô]Criar o .bat
Close #15
Open ion_Path_do_Aplicativo & [Ô]\99-Temp\[Ô] & strNomeSysBat For Output As #15
strLinhaDeComando = [Ô]%windir%\system32\odbcconf.exe /a {CONFIGSYSDSN [Ô] & [Ô][Ô][Ô][Ô] & [Ô]PostgreSQL Unicode[Ô] & [Ô][Ô][Ô][Ô] & [Ô] [Ô] & [Ô][Ô][Ô][Ô] & [Ô]DSN=NomeSeuDSN[Ô] & [Ô]|Description=ConexaoComodoro|SERVERNAME=[Ô] & IPdoSeuServidor & [Ô]|PORT=5432|DATABASE=[Ô] & NomeDoSeuBancoDeDados& [Ô]|UID=[Ô] & NomeDoUsuario & [Ô]|PWD=[Ô] & SenhaDoBancoDeDados & [Ô][Ô][Ô][Ô] & [Ô]}[Ô]
Print #15, strLinhaDeComando
Close #15
[ô]Executar os arquivos .bat
ChDir ion_Path_do_Aplicativo & [Ô]\99-Temp[Ô]
RetShell = Shell(ion_Path_do_Aplicativo & [Ô]\99-Temp\[Ô] & strNomeSysBat, vbHide)
ChDir ion_Path_do_Aplicativo
End If
[ô]--------------------
[ô] !
[ô] ODBC SYSWOW64 !
[ô] !
[ô]--------------------
[ô]Somente se a pasta existir
If fnc_Pasta_Existe(Environ([Ô]SYSTEMROOT[Ô]) & [Ô]\syswow64\[Ô]) Then
[ô]Criar o .bat
Close #15
Open ion_Path_do_Aplicativo & [Ô]\99-Temp\[Ô] & strNomeWowBat For Output As #15
strLinhaDeComando = [Ô]%windir%\syswow64\odbcconf.exe /a {CONFIGSYSDSN [Ô] & [Ô][Ô][Ô][Ô] & [Ô]PostgreSQL Unicode[Ô] & [Ô][Ô][Ô][Ô] & [Ô] [Ô] & [Ô][Ô][Ô][Ô] & [Ô]DSN=NomeSeuDSN[Ô] & [Ô]|Description=ConexaoComodoro|SERVERNAME=[Ô] & IPdoSeuServidor & [Ô]|PORT=5432|DATABASE=[Ô] & NomeDoSeuBancoDeDados & [Ô]|UID=[Ô] & NomeDoUsuario & [Ô]|PWD=[Ô] & SenhaDoBancoDeDados & [Ô][Ô][Ô][Ô] & [Ô]}[Ô]
Print #15, strLinhaDeComando
Close #15
[ô]Executar os arquivos .bat
ChDir ion_Path_do_Aplicativo & [Ô]\99-Temp[Ô]
RetShell = Shell(ion_Path_do_Aplicativo & [Ô]\99-Temp\[Ô] & strNomeWowBat, vbHide)
ChDir ion_Path_do_Aplicativo
End If
Tudo de bom.