Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

проблема с OraSQL.ParamByName [D7, XP]


Xmen ©   (2007-08-02 11:30:00) 

у мения
procedure TDataModule6.SetUserId(Id: Integer);
begin
 with ConnRpUsers do begin
   ParamByName('u').Value := Id;
   ParamByName('c').Value := '1';
   Session.StartTransaction;
   Execute;
   Session.Commit;
 end;
end;

работает нормаль, а этот код
procedure TDataModule6.OraSesion1BeforeDisconnect(Sender: TObject);
begin
 with ConnRpUsers do begin
   ParamByName('u').Value := UserId;
   ParamByName('c').Value := '0';
   Session.StartTransaction;
   Execute;
   Session.Commit;
 end;
end;
говорить - Parametr 'u' not found.
оба процедуры находиться на одном унете - Unit6.pas
вот я немогу поянть в чем поромлема


Xmen   (2007-08-08 11:05:00) [1]

я согласен с вами

по идею процедура должно работать на BeforeDisconnect
но ...
проста я бы хотел определить где я ощибся


Reindeer Moss Eater   (2007-08-07 14:16:00) [2]

Какой бы ни был ЮзерИД, но обламывается-то метод ParamByName, которому глубоко фиолетово какое именно значение будет присвоено параметру, который возвращает этот метод.
Обламывается не присваивание, а именно сам метод ParamByName.
И ставить его вызов в зависимость от значения юзерид - это все равно, что протирать лобовое, когда в баке нет бензина.


Sergey13   (2007-08-07 14:12:00) [3]

> [13] Xmen   (07.08.07 14:06)
> и работает, не ругается

Все таки я бы советовал обратить внимание на другие мои советы/замечания. Отсутствие формальных ошибок еще не говорит о нормальной работоспособности.


Reindeer Moss Eater   (2007-08-07 14:11:00) [4]

написаль на TForm.OnClose и работает, не ругается

Еще один оптический обман.
Тот иф никак на появление ошибки не влияет.


Xmen   (2007-08-07 14:08:00) [5]

>Sergey13 ©   (07.08.07 14:06) [14]
записан 1 раз в дизайне и немняеться


Sergey13   (2007-08-07 14:06:00) [6]

> [11] Xmen   (07.08.07 13:57)

Текст запроса в OraQuery3 записан 1 раз в дизайне или меняется в коде?


Xmen   (2007-08-07 14:06:00) [7]

спасибо Sergey13
я зделал по другому
процедуру
procedure TDataModule6.ssOraBeforeDisconnect(Sender: TObject);
begin
if UserId = -1  then Exit;

with OraQuery3 do begin
 ParamByName('u').Value := UserId;
 ParamByName('c').Value := '0';
 Session.StartTransaction;
 Execute;
 Session.Commit;
end;
end;

написаль на TForm.OnClose и работает, не ругается


Reindeer Moss Eater   (2007-08-07 14:01:00) [8]

Это оптический обман. Его нет.


Xmen   (2007-08-07 13:57:00) [9]

>Reindeer Moss Eater ©   (07.08.07 11:22) [10]
да у меня руский не очень и  извеняюс
но параметра "u" есть


Reindeer Moss Eater   (2007-08-07 11:22:00) [10]

Он же тебе русским языком говорит - "параметр u не найден"
Верь ему. Нету у тебя параметра "u".


Sergey13   (2007-08-07 11:22:00) [11]

> [8] Xmen   (07.08.07 11:15)

Так а смысл то какой в этой таблице? Все ломятся под scott/tiger, а ты уже в программе разруливаешь Иванова/Петрова/Сидорова? Зачем?


Xmen   (2007-08-07 11:15:00) [12]

>[7] Sergey13

у меня в базе:
create table RP_USERS
(
 USER_ID INTEGER not null,
 STATUS  CHAR(1) default 'A' not null, --статус
 LGN     CHAR(10) not null, -- логин
 PWD     CHAR(10) not null, -- пароль
 NAME    VARCHAR2(30) not null, -- имя юзера
 CONN    CHAR(1) default '0' not null -- статут соединение
);
alter table RP_USERS
 add constraint PK_RP_USERS primary key (USER_ID);
чтобы регистрации юзеров
моя программа входит в Оракл скажим scott/tiger и потом ищет из таблицу юзера...

как я понил вы рекоммендуюте, юзеров регистирировать в сам Оракл, а в таблицу?


Sergey13   (2007-08-07 10:59:00) [13]

> SELECT * FROM RP_SALDO WHERE USER_ID = :u
можно так
SELECT * FROM RP_SALDO WHERE USER_ID = UID

Но повторю, использование UserID - потенциально опасное решение. Надумаете мигрировать - столкнетесь с проблемами. По личному опыту знаю. Советую перейти на User (т.е. на имя юзера).

Я не работал с ODAC, но сомнительно мне, что постоянно нужно делать Session.StartTransaction. В Оракле транзакция стартует автоматом после коммита, старта сессии и DDL команд (которые используют неявный коммит). Хотя может я и ошибаюсь - активно работал только с 8-кой.


Xmen   (2007-08-07 10:50:00) [14]

>[5] Sergey13
в базе есть таблица очета RP_SALDO с поля User_Id и каждий юзер формирюет отчет с помощи stored procedure, procedure DO_RP_SALDO(UserId integer, OperDay date) и это процедура записивает данные.
Каждий юзер свой отчет может взят отчет следуюшим обзаром:
SELECT * FROM RP_SALDO WHERE USER_ID = :u


Sergey13   (2007-08-07 09:22:00) [15]

> [4] Xmen   (07.08.07 08:54)

А какой вообще смысл в этих манипуляциях?
UserId - вообще не надо юзать, ибо при переносах БД может меняться. Правильнее юзать имя пользователя.
Зачем передавать имя или ИД-шник параметром, если эти значения и так всегда доступны в самом оракле (user или uid)?
Какой смысл фиксировать нахождение юзера в базе (я так понял это цель?), если юзер может отвалиться и аварийно (и тогда в таблице будет лажа), и если подключенность можно глянуть и в служебных таблицах (сейчас не вспомню названий, но можно)?


Xmen   (2007-08-07 08:54:00) [16]

при входе в систему  UserId принимает идентификатор пользователя, которий заходил в систему
procedure TDataModule6.SetUserId(Id: Integer);
begin
UserId := Id;
with OraQuery3 do begin
  ParamByName('u').Value := UserId;
  ParamByName('c').Value := '1';
  Session.StartTransaction;
  Execute;
  Session.Commit;
end;
end;

содержание OraQuery3:
update rp_users t
  set t.conn = :c
where t.user_id = :u

где conn означает подключенли пользователь в систему

ssOra - TOraSession от CoreLab ODAC

ssOra.OnBeforeDisconnect := ssOraBeforeDisconnect(Sender: TObject);

procedure TDataModule6.ssOraBeforeDisconnect(Sender: TObject);
begin
if UserId = -1  then Exit;

with OraQuery3 do begin
  ParamByName('u').Value := UserId;
  ParamByName('c').Value := '0';
  Session.StartTransaction;
  Execute;
  Session.Commit;
end;
end;


надеюсь что будет поятно,
и извеняюсь за мой руский...


AZIZE   (2007-08-03 10:22:00) [17]


> procedure TDataModule6.SetUserId(Id: Integer);
> begin
>  UserId := Id;
>  with OraQuery3 do begin
>    ParamByName('u').Value := UserId;
>    ParamByName('c').Value := '1';
>    Session.StartTransaction;
>    Execute;
>    Session.Commit;
>  end;
> end;

смысл
procedure TDataModule6.SetUserId(Id: Integer);
begin
with OraQuery3 do begin
  ParamByName('u').Value := Id;
  ParamByName('c').Value := '1';
  Session.StartTransaction;
  Execute;
  Session.Commit;
end;
end;


> procedure TDataModule6.ssOraBeforeDisconnect(Sender: TObject);
>
> begin
>  if UserId = -1  then Exit;
>
>  with OraQuery3 do begin
>    ParamByName('u').Value := UserId;
>    ParamByName('c').Value := '0';
>    Session.StartTransaction;
>    Execute;
>    Session.Commit;
>  end;
> end;
>

где у тебя обьявлен?


Xmen   (2007-08-03 08:42:00) [18]

вот код
unit Unit6;

interface

uses
 SysUtils, Classes, DB, MemDS, DBAccess, Ora;

type
 TDataModule6 = class(TDataModule)
   ssOra: TOraSession;
   spOra: TOraStoredProc;
   qryCoa: TOraQuery;
   OraQuery1: TOraQuery;
   OraQuery2: TOraQuery;
   OraQuery3: TOraQuery;
   OraDataSource1: TOraDataSource;
   OraDataSource2: TOraDataSource;
   OraDataSource3: TOraDataSource;
   OraQuery1CODE_COA: TStringField;
   OraQuery1NAME: TStringField;
   OraQuery2CODE_COA: TStringField;
   OraQuery2CODE: TStringField;
   OraQuery2NAME: TStringField;
   OraQuery3CODE_ACCOUNT: TStringField;
   OraQuery3NAME_ACCOUNT: TStringField;
   OraQuery3CODE_CURR: TStringField;
   OraQuery3VAL: TFloatField;
   OraQuery3OPER_DAY: TDateTimeField;
   OraQuery2REC_ID: TFloatField;
   OraSQL1: TOraSQL;
   OraSQL2: TOraSQL;
   OraQuery4: TOraQuery;
   RpUsers: TOraQuery;
   RpUsersUSER_ID: TFloatField;
   RpUsersSTATUS: TStringField;
   RpUsersLGN: TStringField;
   RpUsersPWD: TStringField;
   RpUsersNAME: TStringField;
   RpUsersCONN: TStringField;
   OraSQL3: TOraSQL;
   procedure DataModuleCreate(Sender: TObject);
   procedure ssOraBeforeDisconnect(Sender: TObject);
 private
   { Private declarations }
   UserId: Integer;
 public
   { Public declarations }
   procedure GetCoaList(List: TStrings);
   procedure GetSelCoaList(List: TStrings);
   procedure SetCoaList(List: TStrings);
   procedure DoSP;
   procedure SetUserId(Id: Integer);
   function GetUserId: Integer;
 end;

var
 DataModule6: TDataModule6;

implementation

{$R *.dfm}

{ TDataModule6 }

procedure TDataModule6.DoSP;
begin

end;

procedure TDataModule6.GetCoaList(List: TStrings);
begin
 List.BeginUpdate;
 List.Clear;
 with qryCoa do if Active then First else Open;
 while not qryCoa.Eof do begin
   List.Add(qryCoa['Code'] + ' - ' + qryCoa['Name']);
   qryCoa.Next;
 end;
 List.EndUpdate;
end;

procedure TDataModule6.GetSelCoaList(List: TStrings);
begin
 List.BeginUpdate;
 List.Clear;
 with OraQuery4 do begin
   Open;
   if IsEmpty then Exit;
   while not Eof do begin
     List.Add(Fields[0].AsString);
     Next;
   end;
 end;
 List.EndUpdate;
end;

function TDataModule6.GetUserId: Integer;
begin
 Result := UserId;
end;

procedure TDataModule6.SetCoaList(List: TStrings);
var i: Integer;
begin
 ssOra.StartTransaction;
 OraSQL2.Execute;
 for i := 0 to List.Count - 1 do begin
   OraSQL1.ParamByName('Usr').Value := UserId;
   OraSQL1.ParamByName('Coa').Value := Copy(List[i], 1, 5);
   OraSQL1.Execute;
 end;
 ssOra.Commit;
end;

procedure TDataModule6.SetUserId(Id: Integer);
begin
 UserId := Id;
 with OraQuery3 do begin
   ParamByName('u').Value := UserId;
   ParamByName('c').Value := '1';
   Session.StartTransaction;
   Execute;
   Session.Commit;
 end;
end;

procedure TDataModule6.DataModuleCreate(Sender: TObject);
var
 i: Integer;
 DataSetsName: string;
begin
 ssOra.BeforeDisconnect := ssOraBeforeDisconnect;
 for i := 0 to ssOra.DataSetCount-1 do
   if (ssOra.DataSets[i].ClassType = TOraQuery)
   then begin
     DataSetsName := ssOra.DataSets[i].Name;
     (ssOra.DataSets[i] as TOraQuery).Prepare;
   end;
end;

procedure TDataModule6.ssOraBeforeDisconnect(Sender: TObject);
begin
 if UserId = -1  then Exit;

 with OraQuery3 do begin
   ParamByName('u').Value := UserId;
   ParamByName('c').Value := '0';
   Session.StartTransaction;
   Execute;
   Session.Commit;
 end;
end;

end.


Sergey13   (2007-08-02 11:38:00) [19]

А что во второй процедуре есть UserId?


Наверх

Титульная страница Поиск, карта сайта Написать письмо