PostgreSQL X Delphi
13/09/2005
0
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
Posts
13/09/2005
Silviogs
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
14/09/2005
Winfor
Será que o super Silvio pode nos dar uma mão ??
Grande abraço.
14/09/2005
Bon Jovi
// -> 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.
15/09/2005
Silviogs
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
Clique aqui para fazer login e interagir na Comunidade :)