Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.02;
Скачать: CL | DM;

Вниз

проблема с OraSQL.ParamByName   Найти похожие ветки 

 
Xmen   (2007-08-02 11:30) [0]

у мения
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
вот я немогу поянть в чем поромлема


 
Sergey13 ©   (2007-08-02 11:38) [1]

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


 
Xmen   (2007-08-03 08:42) [2]

вот код
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.


 
AZIZE ©   (2007-08-03 10:22) [3]


> 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-07 08:54) [4]

при входе в систему  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;


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


 
Sergey13 ©   (2007-08-07 09:22) [5]

> [4] Xmen   (07.08.07 08:54)

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


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

>[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 10:59) [7]

> 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 11:15) [8]

>[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 11:22) [9]

> [8] Xmen   (07.08.07 11:15)

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


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

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


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

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


 
Reindeer Moss Eater ©   (2007-08-07 14:01) [12]

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


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

спасибо 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 и работает, не ругается


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

> [11] Xmen   (07.08.07 13:57)

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


 
Xmen   (2007-08-07 14:08) [15]

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


 
Reindeer Moss Eater ©   (2007-08-07 14:11) [16]

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

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


 
Sergey13 ©   (2007-08-07 14:12) [17]

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

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


 
Reindeer Moss Eater ©   (2007-08-07 14:16) [18]

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


 
Xmen   (2007-08-08 11:05) [19]

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

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



Страницы: 1 вся ветка

Текущий архив: 2007.09.02;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.016 c
15-1185870543
savyhinst
2007-07-31 12:29
2007.09.02
Незавершаемость и прочие првлегии


15-1185947243
Slider007
2007-08-01 09:47
2007.09.02
С днем рождения ! 1 августа 2007 среда


3-1178029672
Sapos
2007-05-01 18:27
2007.09.02
Дисконнект по таймауту


2-1186656444
Kolan
2007-08-09 14:47
2007.09.02
У ComboBox на фрейме не случается MeasurmentComboBoxDrawItem


8-1164552655
Vovan#2
2006-11-26 17:50
2007.09.02
Звук и запись звука