Conexão ODBC DSN-less com Progress

Escrito por Marcos Kirchner em 26 de novembro de 2008, 17:46h

A forma mais usual de realizar uma conexão ODBC a um banco de dados Progress é criar uma fonte de dados na máquina que irá realizar o acesso, informando nome do banco, nome do servidor, porta, login e senha. No momento da conexão, a aplicação faz referência ao nome da fonte de dados e todos os parâmetros já estão configurados.

Uma fonte de dados ODBC é um catálogo (armazenado no registro) com o nome de um driver ODBC e vários parâmetros de conexão. No momento de realizar uma conexão ao banco de dados, a aplicação lê estes parâmetros armazenados e utiliza-os para efetivar a conexão. 

Este método é simples e funciona bem, mas quando há um grande número de estações para configurar (3.000 usuários de uma aplicação client-server) ou quando não é possível alterar a configuração de ODBC de um servidor (um servidor web remoto, por exemplo), a configuração de fontes de dados torna-se impraticável.

Uma conexão DSN-less (Data Source Name-less, ou conexão sem fonte de dados) permite que a aplicação especifique todos os parâmetros diretamente na linha de conexão ao banco, sem a necessidade de configurar uma fonte de dados ODBC. O driver ODBC ainda é necessário para conexão e deve estar instalado na máquina que realizará o acesso.

A linha para conexão DSN-less com o driver do OpenEdge é:
Driver={<driver>}; HostName=<servidor>; PortNumber=<porta>; DatabaseName=<banco>; DefaultIsolationLevel=<isolamento>; LogonID=<usuário>; Password=<senha>;

O driver para conexão com o OpenEdge 10.1C é Progress OpenEdge 10.1C Driver. Os níveis de isolamento válidos para o Progress são:

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE 

Abaixo um exemplo de conexão DSN-less com C#.Net:
OdbcConnection conn = new OdbcConnection("Driver={Progress OpenEdge 10.1C driver}; HostName=localhost; PortNumber=33445; DatabaseName=sports2000; DefaultIsolationLevel=READ COMMITTED; LogonID=sysprogress; Password=sys");

A mesma conexão em PHP poderia ser realizada da seguinte forma:
$conn = odbc_connect("Driver={Progress OpenEdge 10.1C driver}; HostName=localhost; PortNumber=33445; DatabaseName=sports2000; DefaultIsolationLevel=READ COMMITTED;", "sysprogress", "sys", SQL_CUR_USE_ODBC);

A função de conexão do PHP tem parâmetros próprios para login e senha, então não precisamos informá-los novamente na linha de conexão.

Categorias: Banco de dados | Programação | Progress

Tags: ,

Comentários (34) -

em 11 de agosto de 2009, 17:12h

Criei uma conexão Odbcconnection no ASPNET via linha comando e está dando erro de conexão.
Mensagem de erro:
ERROR [IM003] O driver especificado não pôde ser carregado devido ao erro de sistema 126 (Progress OpenEdge 10.1A driver).
Conexão:
Dim cn As New OdbcConnection("Driver={Progress OpenEdge 10.1A driver}; HostName=ems_mat; PortNumber=15450; DatabaseName=ems2mod; DefaultIsolationLevel=READ COMMITTED; LogonID=sysprogress; Password=mod758")
        Dim da As New OdbcDataAdapter
        Dim ds As New DataSet("ds")


        da.SelectCommand = New OdbcCommand("Select * from moda-autor", cn)

da.Fill(ds)
        dg.DataSource = ds
        dg.DataBind()


Alguém poderia nos ajudar?

Obrigada
Cláudia

Cláudia Fernandes

em 12 de agosto de 2009, 09:28h

Cláudia,

O erro 126 indica que o sistema operacional não encontrou o módulo especificado.

O driver ODBC do Progress é composto de várias DLLs. Se uma delas não for localizada ocorre o erro.

Você pode utilizar o gerenciador de fontes de dados ODBC para testar o driver. Lembre-se: o driver precisa estar instalado na máquina onde você executa o programa. No caso do ASP.NET, é o servidor do IIS.

kirchner

em 12 de agosto de 2009, 15:53h

Kirchner,

Quando testo a fonte de dados na máquina ele dá o ok! Isso que é mais estranho. Estou fazendo o teste local.

Tenho o mesmo problema com o Access. Na fonte de dados dá ok mas ao vincular tabelas ele dá um erro.



Cláudia Fernandes

em 12 de agosto de 2009, 17:43h

Cláudia,

Por algum motivo o processo não consegue carregar todas as bibliotecas necessárias. Talvez seja algo relacionado a permissões.

Um bom teste é monitorar o servidor com algum utilitário que liste os acessos a arquivos, como o Process Monitor ( technet.microsoft.com/.../bb896645.aspx ), e verificar se há algum erro de acesso negado ou não encontrado quando o erro ocorre.

kirchner

em 24 de maio de 2010, 22:04h

Pessoal, estou usando o Progress 10 1B e o erro mostrado foi:
ERROR [42S02] [DataDirect][ODBC Progress OpenEdge Wire Protocol driver][OPENEDGE]Table/View/Synonym não encontrado (7519)

O código é esse:

Sub CarregarGrid()
Dim Myconn As OdbcConnection = New OdbcConnection("Driver={Progress OpenEdge 10.1B driver}; HostName=localhost; PortNumber=19407; DatabaseName=sports2000; DefaultIsolationLevel=READ COMMITTED; LogonID=sysprogress; Password=sys")
        Try
            Myconn.Open()

            sSql = "select CustNum,Name,City,Country from customer"

            Dim objCom As New OdbcCommand(sSql, Myconn)
            Dim dr As OdbcDataReader = objCom.ExecuteReader()

            If dr.HasRows = True Then
                GridView1.DataSource = dr
                GridView1.DataBind()
            End If

        Catch ex As Exception
            lblErro.Text = ex.Message
            lblErro.Focus()
            lblErro.ForeColor = Drawing.Color.Red
        Finally
            Myconn.Close()
        End Try
    End Sub

Denis Berteli

em 25 de maio de 2010, 10:21h

Denis,

Quando você faz acesso SQL (ODBC ou JDBC) você tem que informar o Schema/Owner da tabela.

Sua consulta deveria ser algo como:
select CustNum,Name,City,Country from PUB.customer

kirchner

em 14 de junho de 2010, 20:32h

Muito obrigado, deu certo.

Denis dos Reis Berteli

em 29 de julho de 2010, 16:37h

Estou usando o progress 10.1A

esse é o erro:"
ERROR [HYC00] [DataDirect][ODBC Progress OpenEdge Wire Protocol driver]Optional feature not implemented.
ERROR [HY000] [DataDirect][ODBC Progress OpenEdge Wire Protocol driver][OPENEDGE]Server rejects connection on attach.
ERROR [IM006] [DataDirect][ODBC Progress OpenEdge Wire Protocol driver]Driver's SQLSetConnectAttr failed.
ERROR [HYC00] [DataDirect][ODBC Progress OpenEdge Wire Protocol driver]Optional feature not implemented.
ERROR [HY000] [DataDirect][ODBC Progress OpenEdge Wire Protocol driver][OPENEDGE]Server rejects connection on attach.
ERROR [IM006] [DataDirect][ODBC Progress OpenEdge Wire Protocol driver]Driver's SQLSetConnectAttr failed."

o codigo é:
   Sub atualizar_bd()
        Dim conexao As OdbcConnection
        Dim registro As OdbcDataAdapter
        Dim ds As DataSet
        Dim sql As String = "SELECT* FROM PUB.item"
        'conexao com o banco de dados
        conexao = New OdbcConnection("Driver={Progress OpenEdge 10.1A driver}; HostName=anderson-pc; PortNumber=17701; DatabaseName=lifetex; DefaultIsolationLevel=READ COMMITTED; LogonID=sysprogress; Password=sys")
        conexao.Open()

        registro = New OdbcDataAdapter(sql, conexao)
        'preencher o DataSet com o conteudo selecionado da tabela
        ds = New DataSet()
        registro.Fill(ds, "item")
        conexao.Close()
        'Fechar os Objetos DataAdapter e Connection
        registro = Nothing
        conexao = Nothing
        'Exibir os dados no grid
        DataGridView1.DataSource = ds.Tables("item").DefaultView
        'DataGridView1.DataBindings

Anderson

em 30 de julho de 2010, 09:19h

Anderson,

Você consegue conectar neste banco via sqlexp?

O driver do OE 10.1A não mostra mensagens de erro muito detalhadas, mas este erro é bem típico de quando login/senha são inválidos.
Você criou um usuário sysprogress com senha sys no banco que está conectando?

Verifique também o log do banco de dados, as vezes tem algumas informações extra sobre o problema.

kirchner

em 20 de agosto de 2010, 21:14h

Amigo kirchner.

Criei e já consegui fazer a conexao com o banco de dados mais guando tento acessar a tabela tanto pelo delphi usando o ADOTable ou pelo VB.net usando o seguinte codigo abaixo ele me traz o seguinte erro:
ERROR [42S02] [DataDirect][ODBC Progress OpenEdge Wire Protocol driver][OPENEDGE]Table/View/Synonym não encontrado (7519)

Sub atualizar_bd()
        Dim conexao As OdbcConnection
        Dim registro As OdbcDataAdapter
        Dim ds As DataSet
        Dim sql As String = "SELECT* FROM item"
        
        conexao = New OdbcConnection("Driver={Progress OpenEdge 10.1A driver}; HostName=192.168.0.2; PortNumber=17701; DatabaseName=lifetex; DefaultIsolationLevel=READ COMMITTED; LogonID=sysprogress; Password=sysprogress") '
      

        conexao.Open()

        registro = New OdbcDataAdapter(sql, conexao)
      
        ds = New DataSet()
        registro.Fill(ds, "item")
        conexao.Close()
        registro = Nothing
        conexao = Nothing
        
        DataGridView1.DataSource = ds.Tables("item").DefaultView
        
    End Sub

Anderson

em 23 de agosto de 2010, 08:20h

Anderson,

Teu código está executando algo semelhante a:
SELECT * FROM sysprogress.item

Mas tua tabela provavelmente é PUB.item. Altera teu comando SELECT e coloca o PUB antes do nome da tabela.

kirchner

em 26 de agosto de 2010, 10:39h

Olá Marcos,

Tenho uma aplicação em c# que executa um update via odbc no progress. O que me acontece é que ele executa sem erros, mas qdo dou o for each para verificar o registro ele não efetua a atualização. O estranho é que mesmo pegando a string do update e executando-a no sql explorer do progress, ele mostra o update count = 1 mas mesmo assim não atualiza. Já não sei o fazer. Se tiveres alguma ajuda agradeço muito mesmo.

Aldir

aldir

em 26 de agosto de 2010, 14:01h

Aldir,

O Progress normalmente usa uma transação implícita.
Você chegou a dar um COMMIT depois de executar o comando para confirmar a transação?

kirchner

em 11 de fevereiro de 2011, 12:20h

Olá.
Tentei criar uma fonte de dados ODBC acessando o progress na minha máquina mas não consigo.
Quanto testo a conexão aparece:
[DataDirect][ODBC Progress Open Edge Wire Protocol driver][OPENEDGE]Broker rejects connection.

Se tentar acessar por um connection string:
Driver={ODBC Progress OpenEdge Wire Protocol driver}; HostName=2kgmcs02; PortNumber=25503; DatabaseName=EAI; DefaultIsolationLevel=READ UNCOMMITTED; LogonID=sysprogress; Password=sysprogress;

Aparece erro:
ERROR [IM002][Microsoft][ODBC Driver Manager] Nome da fonte de dados não encontrato e nenhum driver padrão especificado.

Já verifiquei os nomes de host, porta e senha estão corretos.
Podem me ajudar?

Daltro Palha

em 11 de fevereiro de 2011, 12:47h

Olá novamente.
Em outra tentativa criei o seguinte string de conexão no "Sql Server Business Inteligence Development Studio" (em minha máquina):
Driver=Progress OpenEdge 10.1c driver;odbcconnection;hostname=2kgmcs02;portnumber=25503;databasename=eai;defaultisolationlevel=READ COMMITTED;logonid=sysprogress

O seguinte erro aparece:
A connection cannot be made to the database.
Set and test the connection string.
ERROR [HY000] [DataDirect][ODBC Progress OpenEdge Wire Protocol driver]Error parsing connect string at offset 86.
ERROR [HY000] [DataDirect][ODBC Progress OpenEdge Wire Protocol driver]Error parsing connect string at offset 86.
O que posso fazer?

Daltro Palha

em 11 de fevereiro de 2011, 15:26h

Daltro,

No primeiro caso, que deu o erro "Broker rejects connection", é algo com o banco. Deve ter uma mensagem no log do banco informando o motivo do erro.

No segundo caso, o nome do driver está errado. Até onde eu sei não existe um driver chamado {ODBC Progress OpenEdge Wire Protocol driver}. O nome do driver é {Progress OpenEdge 10.1C driver} ou {Progress OpenEdge 10.2B driver}, para as versões 10.1C e 10.2B respectivamente.

No último caso, parece ter um erro na string de conexão. Tem um ";odbcconnection" a mais ali no meio e está faltando informar a senha.

kirchner

em 19 de julho de 2011, 14:46h

Olá Pessoal, estou com o mesmo problema, estou tentando criar uma conexão usando o visual .net usando os comando a seguir:

   Sub atualizar_bd()
        Dim conexao As Odbc.OdbcConnection
        Dim registro As Odbc.OdbcDataAdapter
        Dim ds As DataSet
        Dim sql As String = "SELECT * FROM rep-prod"

        conexao = New Odbc.OdbcConnection("Driver={Progress OpenEdge 10.1B driver}; HostName=192.168.0.220; PortNumber=25400; DatabaseName=mov2mov; DefaultIsolationLevel=READ COMMITTED; LogonID=sysprogress; Password=sysprogress") '

        'Progress OpenEdge 10.1B driver

        conexao.Open()

        registro = New Odbc.OdbcDataAdapter(sql, conexao)

        ds = New DataSet()
        registro.Fill(ds, "rep-prod")


        conexao.Close()
        registro = Nothing
        conexao = Nothing

        DataGridView1.DataSource = ds.Tables("rep-prod").DefaultView

    End Sub

Dá o erro abaixo:


ERROR [HYC00] [DataDirect][ODBC Progress OpenEdge Wire Protocol driver]Optional feature not implemented. ERROR [HY000] [DataDirect][ODBC Progress OpenEdge Wire Protocol driver][OPENEDGE]Broker rejects connection. ERROR [IM006] [DataDirect][ODBC Progress OpenEdge Wire Protocol driver]Driver's SQLSetConnectAttr failed. ERROR [HYC00] [DataDirect][ODBC Progress OpenEdge Wire Protocol driver]Optional feature not implemented. ERROR [HY000] [DataDirect][ODBC Progress OpenEdge Wire Protocol driver][OPENEDGE]Broker rejects connection. ERROR [IM006] [DataDirect][ODBC Progress OpenEdge Wire Protocol driver]Driver's SQLSetConnectAttr failed.


Vagner Silva

em 19 de julho de 2011, 16:58h

Vagner,

Como você não informou ONDE o erro ocorre, estou assumindo que é na chamada conexao.Open().

O teu código aparentemente está OK, mas há um erro no banco:
ERROR [HY000] [DataDirect][ODBC Progress OpenEdge Wire Protocol driver][OPENEDGE]Broker rejects connection.

Você tem que verificar no banco de dados qual é o problema. Verifica com o DBA se as configurações do banco estão corretas e as conexões ODBC estão funcionando.

kirchner

em 20 de julho de 2011, 11:39h

Olá Kirchner

o meu banco está setado assim:

$DLC/bin/_mprosrv $CIP_EMS2CAD  -B 1024 -L 60000 -n 24 -Mn 7 -Ma 3 -Mi 1 -Mm 4096 -Mf 30 -bibufs 20 -N tcp -H dtsdb -S 24000 -minport 24001 -maxport 24050  -spin 2000 -ServerType SQL

$DLC/bin/_mprosrv $CIP_EMS2CAD  -B 1024 -L 60000 -n 24 -Mn 7 -Ma 3 -Mi 1 -Mm 4096 -Mf 30 -bibufs 20 -N tcp -H dtsdb -S 25300 -minport 25301 -maxport 25350  -spin 2000 -m3 -ServerType 4GL

Eu criei uma conexão Servertype SQL é por ela que se conecta o ODBC ?

Vagner Silva

em 20 de julho de 2011, 12:03h

Não é obrigatório configurar um broker adicional e usar o parâmetro -ServerType, mas é recomendado.
Eu percebi que você usa o _mprosrv. Recomendamos sempre utilizar o proserve. Talvez este seja o problema.
De qualquer forma, o ideal é verificar no log do banco qual o problema.

kirchner

em 29 de julho de 2011, 10:29h

Kirchner, bom dia

Estou com um outro problema, minha conexão não está funcionando em tabelas que tem um traço no nome exemplo: "rep-prod", dá o erro abaixo:

[ run-time error]

[datadirect][odbc progress openedge wire protocol driver]
[OPENEDGE]table/view/synonym not found(7519)

Tem alguma ideia ?

Vagner Silva

em 29 de julho de 2011, 12:01h

Vagner,

O traço é interpretado como menos.
Veja:
SELECT 2-1 FROM tabela;

Isso retorna 1 para todas as linhas. Se você quer que o traço faça parte do nome, use aspas:
SELECT colunas FROM pub."rep-prod";

kirchner

em 29 de julho de 2011, 14:51h

Kirchner, boa tarde.

Já tentei isso, mas dá erro no vb, pois nele o comando todo tem que ficar entre aspas:

.CommandText = "select * from PUB.rep-prod"

Vagner Silva

em 29 de julho de 2011, 16:10h

Faz muito tempo que eu não programo VB, mas acho que o caractere de escape era "".
Ficaria algo assim:

cmd.CommandText = "select * from pub.""rep-prod"""

Senão você precisa ver qual é o caractere. Se fosse C/C++/C# você usaria \". Cada linguagem tem uma forma de fazer isto.

kirchner

em 1 de agosto de 2011, 08:29h

Bom dia Kirchner.

É isso mesmo deu certo,

Muito Obrigado.

Vagner Silva

em 31 de agosto de 2011, 07:47h

Boas,

Estou conectado através do c# a uma base de dados Progress 10.1B, consigo fazer SELECT e UPDATE sem qualquer problema e inclusive utilizar tabelas com atributos array através de PRO-ELEMENT, tenho um problema agora que é quando uma tabela Progress contêm um campo para BLOB, não consigo fazer o select desse campo da tabela e presumo que seja necessária alguma configuração adicional, pelo que não a encontro em algum lugar, pode-me ajudar?

Desde já obrigado.

Nuno Soares

em 31 de agosto de 2011, 13:32h

Nuno,

Nunca tentei usar BLOB com SQL no Progress. Se quiser mandar o erro, posso ver se encontro algo de útil...

kirchner

em 1 de novembro de 2011, 13:08h

Conexão Progress x SQL
Estou dando select * from PUB.PWAP_ITEM e dá a msg de erro:
Encountered internal error in SQL ENGINE at 3968 in Z:/obs_sql/sql/src/progstub/pro_cache.cxx. Contact Progress Technical Support.
Como resolvo isso?

Cristina

em 1 de novembro de 2011, 15:22h

Cristina,

Chegou a olhar o log do banco de dados? As vezes temos algumas informações úteis lá.
Algumas situações também o dbtool resolve, para ajustar os tamanhos dos campos caracter.

kirchner

em 14 de dezembro de 2011, 19:13h

Ola a todos,
Fizemos uma migração de BD 10.1c de um servidor HPUX-PARISC para um HPUX-IA64 mantendo as versões do HPUX e do Progress.
O Banco de dados está acessível via EMS, mas quando tento acesso via ODBC recebo a mensagem de "Broker rejects connection".
Verificamos via PROMON e os brokers SQL estão ativos paras as respectivas portas de cada base de dados.
Ao tentar acesso via ODBC observamos que o cliente chega a se conectar com o servidor, utilizamos o comando "netstat -na|grep 15590" e, no log do BD obtivemos o seguinte registro ao receber o erro do ODBC Test:
[2011/12/14@10:54:50.482-0600] P-29306      T-1     I BROKER  1: (8841)  SQL server process terminated.

Alguém teria alguma sugestão para resolver esta falha?

Agradeço antecipadamente,
Emerson

Emerson

em 15 de dezembro de 2011, 08:14h

Emerson,

É possível que as configurações de java e todo o resto não estejam corretas.
Tem um KB que explica alguns dos problemas recorrentes com conexões SQL:
ingleses.datasul.com.br/.../main.htm?kbid=6709

kirchner

em 22 de dezembro de 2011, 15:11h

Estou com uma conexão via JDBC e está dando o seguinte erro:
Erro: [DataDirect][OpenEdge JDBC Driver][OpenEdge] Syntax error in SQL statement at or about ".'dzcidade'" (10713)

meu comando:
/* String de conexão com o banco de dados */
         String urlDB = new String("jdbc:datadirect:openedge://192.168.0.95:50013"
                 + ";databaseName=srcadger");

rs = stmt.executeQuery("select nm-cidade from PUB.dzcidade");

o que será que está errado?

obrigada.

Aline

em 22 de dezembro de 2011, 15:11h

desculpa,
o erro é este:

Erro: [DataDirect][OpenEdge JDBC Driver][OpenEdge] Table/View/Synonym não encontrado (7519)

Aline

em 22 de dezembro de 2011, 16:48h

Aline,

Quando algum nome tem um hífen você deve delimitá-lo com aspas.
Ficaria algo assim:
rs = stmt.executeQuery("select \"nm-cidade\" from PUB.dzcidade");

kirchner

Comentar




biuquote
  • Comentário
  • Pré-visualização
Loading


Acesso LogMeIn

Informe o código PIN: