Форум: "Начинающим";
Текущий архив: 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.05 c