Приветствую вас!
Подскажите, может у кого то есть готовый пример кода, с подключением к PostgreSQL и элементарной работой с БД (допустим запрос создания пользователя).
			
		Модератор: Модераторы
uses Classes, Crt, SysUtils, lNet, SQLDB, PQConnection,
  TServer = class (TThread)                     {* сервер обмена файлами *}
  private
    SQLQuery:       TSQLQuery;                     {коммандный процессор SQL}
    SQLTransaction: TSQLTransaction;               {координатор транзакций}
    PQConnection:   TPQConnection;                 {интерфейс PostgreSQL сервера}
  public
    constructor Create(Params: pSRVParamRec);
    destructor Destroy; override;
  protected
    procedure Execute; override;
  end;constructor TServer.Create(Params: pSRVParamRec);
begin
  SQLQuery:=          TSQLQuery.Create(nil);
  SQLTransaction:=    TSQLTransaction.Create(nil);
  PQConnection:=      TPQConnection.Create(nil);
  
  inherited Create(false);
end;
destructor TServer.Destroy;
begin
  PQConnection.Close;
  SQLQuery.Free;
  SQLTransaction.Free;
  PQConnection.Free;
  inherited Destroy;
end;
procedure TServer.Execute;
begin
  try                                              {подключение к SQL}
    PQConnection.HostName:=     Param^.SQL_Server;
    PQConnection.UserName:=     Param^.SQL_User;
    PQConnection.Password:=     Param^.SQL_Password;
    PQConnection.DatabaseName:= Param^.SQL_DateBase;
    PQConnection.Open;
    SQLQuery.DataBase:=        PQConnection;
    SQLQuery.Transaction:=     SQLTransaction;
    SQLTransaction.DataBase:=  PQConnection;
    PQConnection.Transaction:= SQLTransaction;
  except
    on E: Exception do begin
      LogMsg:= '@Execute: ' + E.Message;
      Log(LogMsg);
      Param^.Critical_Log(LogMsg);
      Terminate;
    end;
  end;
 +++
end;procedure TServer.SrvReceive(aSocket: TLSocket);
  function UserAuth(Rec: pSocketRec): boolean; {SQL запрос для проверки user/pass}
  var Count: integer = 0;
      SQL_File: TStringList;
  begin
    Result:= false;
    if (Rec^.User_Code < 1) or                  {Преподавательский состав ID < 0}
      (Length(Rec^.User_Password) < 1) then exit(false); {пароль не может быть пустым}
    try
      SQL_File:= TStringList.Create;
      SQL_File.LoadFromFile(Param^.SQL_Path + DirectorySeparator + 'auth_user.sql');
      SQLQuery.SQL.Text:= SQL_File.Text;
      SQL_File.Free;
      SQLQuery.Params.ParamByName('SI_USRCOD').Value:=Rec^.User_Code;
      SQLQuery.Params.ParamByName('SI_PASS').Value:=Rec^.User_Password;
      SQLQuery.Open;
      while (not SQLQuery.EOF) do begin
        SQLQuery.Next;
        inc(count);
      end;
      SQLQuery.ClearFields;
      SQLQuery.Close;
      if (Count = 1) then exit(True) else exit(false);
    except
      on E: Exception do begin
             +++
      end;
    end;
  end;
begin
 +++
        if not UserAuth(Client) then begin ...
+++
end;SELECT * FROM users WHERE usr_id = :SI_USRCOD AND passwd = :SI_PASS AND blocked = FALSE
до глубины души согласен.Zorro писал(а):в одном из постов на форуме видел что при использовании Inser Into Update или SET нужно использовать не SQLQuery.Open а ExecSQL... пробовал.. ошибка не появляется но и в таблицу ничего не добавляется
PQConnection1.Connected:=true;
   except
      .............
   end;
   try
      SQLTransaction1.Active:=true;
   except
      .................
    end;
   try
           SQLQuery1.Close;
           SQLQuery1.SQL.Clear;
           SQLQuery1.Insert;
           SQLQuery1.SQL.Add('INSERT INTO s1.t1(pole)VALUES (99);');
           SQLQuery1.Open;
   except
     .................
   end;
      
PQConnection1.Connected:=true;
   except
      .............
   end;
   try
      SQLTransaction1.Active:=true;
   except
      .................
    end;
   try
      SQLQuery1.Close;
      SQLQuery1.SQL.Clear;
      SQLQuery1.SQL.Add('INSERT INTO s1.t1(pole)VALUES (99);');
      SQLQuery1.ExecSQL;
   except
     .................
   end;
procedure TfrmTools.DoSaveIPsToDB(v_contype, v_class, v_net, v_mask, v_gateway,
                       v_broadcast, v_state, v_name: String);
begin
  try
    sqlToolsActions.SQL.Text :=
    'INSERT INTO localip('
       +'lip_contype, lip_class, lip_net, lip_mask, lip_gateway, '
       +'lip_broadcast, lip_state, lip_name) '
       +'VALUES ('
       +v_contype+', '  //lip_contype
       +v_class +', ' //lip_class
       +v_net +', ' //lip_net
       +v_mask +', ' //lip_mask
       +v_gateway +', ' //lip_gateway
       +v_broadcast+', ' //lip_broadcast
       +v_state+', '  //lip_state
       +v_name //lip_name
       +');';
    sqlToolsActions.ExecSQL;
  except
   //error
  end;
end;
try
           SQLQuery1.SQL.Text:='select * from mytable where <какое-нибудь условие, возвращающее заведомо ноль строк - чтобы базу не грузить почем зря>';
           SQLQuery1.Open;
           SQLQuery1.Insert;
           SQLQuery1.FieldByName('my_integer_field').AsInteger:=123;
           SQLQuery1.FieldByName('my_datetime_field').AsDateTime:=now-2; // типа позавчера
           SQLQuery1.FieldByName('my_string_field').AsString:='Строка какая-нибудь';
           SQLQuery1.Post;
   except
     .................
   end;
SQLQuery1.FieldByName('my_string_field').AsString:='Строка какая-нибудь';sadavod писал(а):Спасибо за ответы еще не тестировал как они работают (дома проверю отпишусь), не понятен мне это момент покамест
<какое-нибудь условие, возвращающее заведомо ноль строк
зачем это?
Climber писал(а):sadavod
В способе №1 надо делать немного иначе:
...
const
  sql001 = 'Неверно заданы параметры в процедуре';   
...
function InsSQL  (Base:tIBConnection; TableName: string; FieldsName: array of string; NewValues: array of variant; DoCommitRetaining: boolean = True): boolean;
  var iSQL: tSQLQuery;
      S: string; I: Integer;
begin
  if (Length(FieldsName) <> Length(NewValues))
    then begin
      raise Exception.Create(sql001+' InsSQL');
      exit;
    end;
  iSQL:= tSQLQuery.Create(Base);
  iSQL.DataBase:= Base;
  iSQL.Transaction:= Base.Transaction;
  iSQL.SQL.Clear; // ?????
  iSQL.SQL.Add('insert into '+TableName+' ');
  S:='';
  for I:= 0 to High(FieldsName)
    do S:= S + TableName+'.'+FieldsName[i]+',';
  SetLength(S, Length(S)-1);
  iSQL.SQL.Add('('+S+') values ');
  S:='';
  for I:= 0 to High(NewValues)
    do S := S+':'+IntToStr(i)+',';
  SetLength(S, Length(S)-1);
  iSQL.SQL.Add('('+S+')');
  for I:= 0 to High(NewValues)
    do iSQL.Params.ParamByName(inttostr(i)).Value:= NewValues[i];
  try
    iSQL.ExecSQL;
    if DoCommitRetaining then Base.Transaction.CommitRetaining;
  finally
    iSQL.Close; iSQL.Free;
    Base.Transaction.Active:=True;
  end;//finally
Result:= True;
end;
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1