PostgreSQL X Delphi

13/09/2005

0

Olá gente,

Ontem estive tentando testar o PostregreSQL em casa.Primeiro foi uma luta para configuraqr o ADO, e depois num funfava o ADOTable.Dizia algo como que se a tabela não pertencesse a alguma coisa.MAs enfim, não adianta eu tentar explicar por que foram muitos erros que cometi e por sua vez, muitos paus aconteceram.Seguinte, teria alguém aí (uma boa alma), que já tivesse trabalhado com o PostgreSQL, e soubesse fazer a conexão com o delphi, que pudesse me explicar?

Desde já agradeço à todos

[color=green:fc862f4c5e]Movido de Delphi para PostgreSQL[/color:fc862f4c5e]


Vagner Monteiro

Vagner Monteiro

Responder

Posts

13/09/2005

Silviogs

Olá amigo

em primeiro lugar não é um boa opção usar ADO com postgresql existe o ZeosLib 6.5.1 que funciona perfeitamente bem, tanto para delphi7 como no lazarus win32 e lazarus linux. Bem mais fácil de acessar sua base de dados no postgre e o mais importante o acesso é direto a base sem BDE, ODBC, existe alguns tópicos postados por mim aqui no forum sobre o assunto, dê uma pesquisada.

Atenciosamente

Silvio Guedes


Responder

14/09/2005

Winfor

Em relação ao assunto, estou tentando utilizar o Postgres com a coletânea de componentes da MicroOlap, a conexão é legal e sem problemas. Porém, pelo que li no ClubeDelphi o Delphi não dispôe de um Provider que suporte o Postgres acho que por isso estou tendo erro. O componente da Zeos 6.5.1 me dá suporte até ao Postgres 7.4 pelo que está na propriedade. E eu estou tendo um erro na hora de gravar na tabela pq não sei qual componente devo realmente usar.

Será que o super Silvio pode nos dar uma mão ??

Grande abraço.


Responder

14/09/2005

Bon Jovi

Exemplo pra fazer todo o básico em ADO+ODBC, configurando o DataSource ODBC, conectando na base de dados e fazendo query:

// -> Teste.pas:

unit Teste;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, ADODB;

type
  TfrmTeste = class(TForm)
    btnTeste: TButton;
    ADODataSet1: TADODataSet;
    ADOCommand1: TADOCommand;
    ADOConnection1: TADOConnection;
    procedure btnTesteClick(Sender: TObject);
    procedure ADOConnection1BeforeConnect(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmTeste: TfrmTeste;

implementation

{$R *.dfm}

uses
  Global;

procedure TfrmTeste.ADOConnection1BeforeConnect(Sender: TObject);
begin
  TGlobal.ConfiguraODBC(´sua_base_dados´, ´localhost´, ´seu_usuario´, ´sua_senha´, ´DataSourceTeste´, ´PostgreSQL´);
  ADOConnection1.ConnectionString := ´Provider=MSDASQL.1;Persist Security Info=False;Data Source=DataSourceTeste´;
end;

procedure TfrmTeste.btnTesteClick(Sender: TObject);
begin
  ADOConnection1.Connected := True;
  ADODataSet1.Connection := ADOConnection1;
  ADOCommand1.Connection := ADOConnection1;
  
  ADOCommand1.CommandText := ´CREATE TABLE TESTE (ID_TESTE NUMERIC(5) PRIMARY KEY)´;
  ADOCommand1.Execute;

  ADOCommand1.CommandText := ´INSERT INTO TESTE (ID_TESTE) VALUES (10)´;
  ADOCommand1.Execute;  

  ADODataSet1.CommandText := ´SELECT ID_TESTE FROM TESTE´;
  ADODataSet1.Open;
  
  ShowMessage(´Teste ok - ´ + ADODataSet1.FieldByName(´ID_TESTE´).AsString);

  ADODataSet1.Close;
  ADOConnection1.Connected := False;
end;

end.


// -> Teste.dfm:

object frmTeste: TfrmTeste
  Left = 192
  Top = 107
  Width = 696
  Height = 480
  Caption = ´frmTeste´
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = ´MS Sans Serif´
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object btnTeste: TButton
    Left = 8
    Top = 8
    Width = 75
    Height = 25
    Caption = ´btnTeste´
    TabOrder = 0
    OnClick = btnTesteClick
  end
  object ADODataSet1: TADODataSet
    Parameters = <>
    Left = 124
    Top = 8
  end
  object ADOCommand1: TADOCommand
    ExecuteOptions = [eoExecuteNoRecords]
    Parameters = <>
    Left = 156
    Top = 8
  end
  object ADOConnection1: TADOConnection
    BeforeConnect = ADOConnection1BeforeConnect
    Left = 92
    Top = 8
  end
end


// -> Global.pas:

unit Global;

interface

uses
  Windows, Messages, SysUtils;

type
  TGlobal = class(TObject)
  private
    class function ExisteDataSourceODBC(DataSource: string): boolean;
    class procedure ConfiguraRegistroODBC(NomeBase, Servidor, Usuario, Senha, ODBCDataSource: string);
  public
    class procedure ConfiguraODBC(NomeBase, Servidor, Usuario, Senha, DataSourceODBC, ODBCDriver: string);
  end;

implementation

uses
  Registry;

const
  ODBC_ADD_DSN = 1;

class function TGlobal.ExisteDataSourceODBC(DataSource: string): boolean;
Var
  Registro: TRegistry;
Begin
  Registro := TRegistry.Create;
  Try
    Registro.RootKey := HKEY_CURRENT_USER;
    Result := Registro.KeyExists(´\Software\ODBC\ODBC.INI\´ + DataSource);
    Registro.CloseKey;
  finally
    FreeAndNil(Registro);
  end;
end;

class procedure TGlobal.ConfiguraRegistroODBC(NomeBase, Servidor, Usuario, Senha, ODBCDataSource: string);
var
  Registro: TRegistry;
begin
  Registro := TRegistry.Create;
  try
    Registro.RootKey := HKEY_CURRENT_USER;
    if Registro.OpenKey(´\Software\ODBC\ODBC.INI\´ + ODBCDataSource, False) then
    begin
      if Registro.ReadString(´Database´) <> NomeBase then
        Registro.WriteString(´Database´, NomeBase);

      if Registro.ReadString(´Servername´) <> Servidor then
        Registro.WriteString(´Servername´, Servidor);

      if Registro.ReadString(´Username´) <> Usuario then
        Registro.WriteString(´Username´, Usuario);

      if Registro.ReadString(´Password´) <> Senha then
        Registro.WriteString(´Password´, Senha);

      if Registro.ReadString(´Port´) <> ´5432´ then
        Registro.WriteString(´Port´, ´5432´);

      if Registro.ReadString(´Protocol´) <> ´6.4´ then
        Registro.WriteString(´Protocol´, ´6.4´);

      if (Registro.ReadString(´ReadOnly´) = ´1´) or (Registro.ReadString(´ReadOnly´) = ´´) then
        Registro.WriteString(´ReadOnly´, ´0´);

      if Registro.ReadString(´UseDeclareFetch´) <> ´1´ then
        Registro.WriteString(´UseDeclareFetch´, ´1´);

      if Registro.ReadString(´ByteaAsLongVarBinary´) <> ´1´ then
        Registro.WriteString(´ByteaAsLongVarBinary´, ´1´);

      Registro.CloseKey;
    end;
  finally
    FreeAndNil(Registro);
  end;
end;

function SQLConfigDataSource(hwndParent: HWND; fRequest: WORD; lpszDriver: LPCSTR; lpszAttributes: LPCSTR): BOOL; stdcall; external ´ODBCCP32.DLL´;
  
class procedure TGlobal.ConfiguraODBC(NomeBase, Servidor, Usuario, Senha, DataSourceODBC, ODBCDriver: string);
begin
  if not ExisteDataSourceODBC(DataSourceODBC) then
    SQLConfigDataSource(
      0, ODBC_ADD_DSN, PAnsiChar(ODBCDriver), PAnsiChar(´DSN=´ + DataSourceODBC + #00));
      
  TGlobal.ConfiguraRegistroODBC(NomeBase, Servidor, Usuario, Senha, DataSourceODBC);
end;

end.



Responder

15/09/2005

Silviogs

Olá amigos

no que diz respeito a Super-Silvio menos!menos!menos! rsrsrsrs. Já a sua pergunta no comp. Zconnection na propriedade protocol use postgresql(libpq.dll) para qualquer PostgreSQL do 6-8, agora se voce usar no protocol postgresql-7.4 só irar funcionar a lib libpq74.dll mesmo sendo qualquer PostgreSQL do 6-8. A libpq.dll não sofreu mudanças de interface em seu código. No que diz respeito em vc gravar dados no seu banco pgsql use o componente zquery mudando a propriedade requestlive para true se estiver usando delphi já no lazarus não existe esta propriedade pois poderá gravar normalmente.

Atencisoamente

Silvio Guedes


Responder

APRENDA A PROGRAMAR DO ZERO AO PROFISSIONAL

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar