Conexão Postgree 15 SQLMIX, SDDODBC, SDDPG

Forum sobre SQL.

Moderador: Moderadores

Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Conexão Postgree 15 SQLMIX, SDDODBC, SDDPG

Mensagem por Itamar M. Lins Jr. »

Olá!
Testei aqui usando GCC_13.1.0 64bits. Harbour 3.2
Conectou, precisa copiar de C:\Program Files\PostgreSQL\15\bin essas duas DLL´s para a pasta do ".EXE"

Código: Selecionar todos

07/06/2023  00:20           475.769 libintl-9.dll
07/06/2023  00:19           312.832 libpq.dll
No prg precisou de:

Código: Selecionar todos

#include "dbinfo.ch"
#require "sddodbc" 
#require "rddsql"  
#require "sddpg" 
REQUEST DBFCDX, DBFFPT, DBFDBT, LETO, SQLMIX, SDDODBC, SDDPG
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Conexão Postgree 15 SQLMIX, SDDODBC, SDDPG

Mensagem por Itamar M. Lins Jr. »

Olá!
A conexão:

Código: Selecionar todos

FUNCTION ConectarPG
cRdd  := RDDSETDEFAULT( "SQLMIX" )
nCon :=  rddInfo( RDDI_CONNECT, { "POSTGRESQL","127.0.0.1","postgres","xyz",,"5432"})
IF nCon == 0
   hwg_MsgInfo("Não conectou no Postgres: " + Str(nCon) )
   RDDSETDEFAULT( cRdd )
   RETURN .T.
ELSE
   hwg_MsgInfo("Conectou no Postgres: " + Str(nCon) )
ENDIF

RDDINFO(RDDI_DISCONNECT, nCon)
RDDSETDEFAULT( cRdd )
RETURN .T.
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Conexão Postgree 15 SQLMIX, SDDODBC, SDDPG

Mensagem por sygecom »

Sou suspeito de falar, por que sou muito fã do PostgreSQL.

O SQLMIX do Harbour é muito bom mesmo. Tem um ótimo desempenho, parabéns pelas contribuições aqui.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Conexão Postgree 15 SQLMIX, SDDODBC, SDDPG

Mensagem por Itamar M. Lins Jr. »

Olá!
HAHAHAHAHA! Me ensina agora como eu faço isso ?
ESSAS DUAS LINHAS.

rddInfo( RDDI_EXECUTE, "SELECT `CREATE DATABASE dbase` WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = `dbase`)" )
rddInfo( RDDI_EXECUTE, "SELECT dbase" ) já usei USE e c\ como comandos. Mas acredito que depende do de cima.


IF NO EXISTS do MySql e USE (abrir DATABASE).

Código: Selecionar todos

#require "rddsql"
#require "sddpg"
#require "sddodbc"

#include "dbinfo.ch"
#include "error.ch"

REQUEST SDDPG
REQUEST SQLMIX
REQUEST SDDODBC

ANNOUNCE RDDSYS

FIELD RESIDENTS, CODE, NAME

PROCEDURE Main()

cls  

   rddSetDefault( "SQLMIX" )

   ? "RDDs:"; AEval( rddList(), {| x | QQOut( "", x ) } )      

   IF rddInfo( RDDI_CONNECT, { "POSTGRESQL","127.0.0.1","postgres","xyz",,"5432"}) == 0
      ? "Não conectou com o servidor PG" 
      RETURN
   ENDIF

   if !rddInfo( RDDI_EXECUTE, "SELECT `CREATE DATABASE dbase` WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = `dbase`)"  )   
      ? "Falha ao criar database dbase" //Não dá erro mas também não cria nada. Seria o IF NOT EXIST do MySQL.
   endif

   If !rddInfo( RDDI_EXECUTE, "\c dbase" ) //Aqui seria o USE do mysql, não funciona.
      ? "Falha conectando database dbase"
   EndIF

//Aqui pra baixo não olhei por conta desses dois BO ai de cima.
   CreateTable()

   ? "Let's browse table (press any key)"
   Inkey( 0 )
   dbUseArea( .T., , "SELECT * FROM paises", "paises" )
   Browse()
/*
   ? "Let's browse table ordered by resident count (press any key)"
   Inkey( 0 )
   INDEX ON field->RESIDENTS TAG residents TO country
   Browse()

   dbCloseArea()

   // append and goto tests 

   dbUseArea( .T., "SQLMIX" , "SELECT * FROM country", "country" )

   FOR tmp := 500 TO 600
      dbAppend()
      field->CODE := StrZero( tmp, 3 )
      field->NAME := "Test append " + hb_ntos( tmp )
   NEXT

   dbGoto( 101 )

   INDEX ON field->RESIDENTS TAG residents TO country
*/
   dbCloseAll()
   cls
   RETURN

STATIC PROCEDURE CreateTable()

   LOCAL tmp

   ? rddInfo( RDDI_EXECUTE, "DROP TABLE paises" )
   ? rddInfo( RDDI_EXECUTE, "CREATE TABLE paises" + ;
      "(CODE char(3), NAME char(50), RESIDENTS int)" )
   ? rddInfo( RDDI_EXECUTE, "INSERT INTO country values " + ;
      "('LTU', 'Lithuania', 3369600), " + ;
      "('USA', 'United States of America', 305397000), " + ;
      "('POR', 'Portugal', 10617600), " + ;
      "('POL', 'Poland', 38115967), " + ;
      "('AUS', 'Australia', 21446187), " + ;
      "('FRA', 'France', 64473140), " + ;
      "('RUS', 'Russia', 141900000)" )

   FOR tmp := 1 TO 100
      rddInfo( RDDI_EXECUTE, "INSERT INTO country VALUES " + ;
         "('" + StrZero( tmp, 3 ) + "', 'TestSQL " + hb_ntos( tmp ) + "', 3369600)")
   NEXT

   RETURN
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Conexão Postgree 15 SQLMIX, SDDODBC, SDDPG

Mensagem por sygecom »

Mestre,

Aqui faço assim, primeiro veja se existe o database, se não tem cria.

// se exite e o tamamnho de uso do database

Código: Selecionar todos

SELECT
    pg_database.datname,
    pg_size_pretty(
        pg_database_size(pg_database.datname)
    ) AS size
FROM pg_database where pg_database.datname='TESTE'
Depois se não existir mando criar:

Código: Selecionar todos

CREATE DATABASE "TESTE"
    WITH
    OWNER = nome_user
    TEMPLATE = template0
    ENCODING = 'WIN1252'
    CONNECTION LIMIT = -1
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
marco.prodata
Usuário Nível 3
Usuário Nível 3
Mensagens: 238
Registrado em: 30 Nov 2018 10:07
Localização: Caratinga

Conexão Postgree 15 SQLMIX, SDDODBC, SDDPG

Mensagem por marco.prodata »

Itamar,

Acho que não tem como da conexão com um banco de dados, começar a manipular outro, como fazemos pelo prompt com o comando USE, acho que você vai ter que criar uma conexão com o banco criado.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Conexão Postgree 15 SQLMIX, SDDODBC, SDDPG

Mensagem por Itamar M. Lins Jr. »

Olá!
Ficou assim, tudo rodando 100%!

Código: Selecionar todos

#require "rddsql"
#require "sddpg"
#require "sddodbc"

#include "dbinfo.ch"
#include "error.ch"

REQUEST SDDPG
REQUEST SQLMIX
REQUEST SDDODBC

ANNOUNCE RDDSYS

FIELD RESIDENTS, CODE, NAME

PROCEDURE Main()
Local nCon, tmp
setmode(33,100)

   rddSetDefault( "SQLMIX" )

   ? "RDDs:"; AEval( rddList(), {| x | QQOut( "", x ) } )      

   IF nCon := rddInfo( RDDI_CONNECT, { "POSTGRESQL","127.0.0.1","postgres","xyz",,"5432"}) == 0
      ? "Could not connect to the server"
      RETURN
   ENDIF

   dbUseArea( .T., "SQLMIX" , "select datname from pg_database where datname = 'dbase'",'xx'  )

   if empty(xx->(lastrec()))
      if !rddInfo( RDDI_EXECUTE, "CREATE DATABASE dbase;"  )   
         ? "Fail to create database dbase"
     endif
   endif

   xx->(dbCloseArea())
   ? RDDINFO(RDDI_DISCONNECT, nCon)

   IF rddInfo( RDDI_CONNECT, { "POSTGRESQL","127.0.0.1","postgres","xyz","dbase","5432"}) == 0
      ? "Could not connect to the server"
   ENDIF

   CreateTable()

   ? "browse da tabela (pressione uma tecla)"
   dbUseArea( .T., , "SELECT * FROM paises", "paises" )
   Browse()

   ? "browse da tabela ordenado por resident count (pressione uma tecla)"
   inkey(0)
   INDEX ON field->RESIDENTS TAG residents 
   Browse()

   dbCloseArea()

   dbUseArea( .T., "SQLMIX" , "SELECT * FROM paises", "paises" )

   FOR tmp := 500 TO 600
      dbAppend()
      field->CODE := StrZero( tmp, 3 )
      field->NAME := "Test append " + hb_ntos( tmp )
   NEXT

   dbGoto( 101 )

   INDEX ON field->RESIDENTS TAG residents 
   browse()
   dbCloseAll()
   cls
   RETURN

STATIC PROCEDURE CreateTable()

   LOCAL tmp

   ? rddInfo( RDDI_EXECUTE, "DROP TABLE paises" )
   ? rddInfo( RDDI_EXECUTE, "CREATE TABLE paises (CODE char(3), NAME char(50), RESIDENTS int)" )
   ? rddInfo( RDDI_EXECUTE, "INSERT INTO paises values " + ;
      "('LTU', 'Lithuania', 3369600), " + ;
      "('USA', 'United States of America', 305397000), " + ;
      "('POR', 'Portugal', 10617600), " + ;
      "('POL', 'Poland', 38115967), " + ;
      "('AUS', 'Australia', 21446187), " + ;
      "('FRA', 'France', 64473140), " + ;
      "('RUS', 'Russia', 141900000)" )

   FOR tmp := 1 TO 100
      rddInfo( RDDI_EXECUTE, "INSERT INTO paises VALUES " + ;
         "('" + StrZero( tmp, 3 ) + "', 'TestSQL " + hb_ntos( tmp ) + "', 3369600)")
   NEXT

   RETURN
PS. Ainda não sei como conectar a uma tabela do banco de dados tive que fechar a conexão e abrir já conectado na tabela.
O comando "IF NOT EXISTS" funciona para tabelas não tem para DATABASE.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Responder