Приветствую вас!
Подскажите, может у кого то есть готовый пример кода, с подключением к 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;
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 242