Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];

Вниз

проблема с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.047 c
4-1173319490
Cj
2007-03-08 05:04
2007.09.02
Свойства файла


4-1173254885
C@N
2007-03-07 11:08
2007.09.02
Как пронюхать "протокол" железяки работающей через COM1


4-1173165948
vir
2007-03-06 10:25
2007.09.02
Получить хенл окна имеющего фокус.


2-1186397737
Dmitry_177
2007-08-06 14:55
2007.09.02
какие таблицы лучше использовать для локальной БД?


4-1173440828
dzuev
2007-03-09 14:47
2007.09.02
usb - порт и принтер





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский