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

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

Получения значения OUT параметра [D7]


Гаврила ©   (2005-01-13 11:17:00) 

Доброго времени суток
имеем базу на MSSQL 2000
в ней таблица "folders"
имеем потомка от TADOQuery
задача - добавить запись в таблицу и получить ее ID
(ID - автоинкремент-поле в таблице типа int)

пишу код (это тестовый код, так что не обращайте внимания на его шероховатости)

procedure TCustomNBQuery.CreateDBO(const AObject: IDBObject);
var
 s: string;
 Param: TParameter;
 N: Variant;
begin
 Close;
 Parameters.Clear;
 s:='Insert into folders (Title, ParentID, Position) Values (''новая папка'', 0, 0) SET :IDParam = SCOPE_IDENTITY()';
 Param:=Parameters.AddParameter;
 Param.Name:='IDParam';
 Param.Direction:=pdOutput;
 Param.DataType:=ftInteger;
 Param.Size:=4;
 SQL.Text:=s;
 ExecSQL;
 N:=Parameters[0].Value;
end;


Запись добавляется, но в переменной N значение NULL

как победить ?


Гаврила   (2005-01-13 13:57:00) [1]

В общем, вариант с параметрами так и не заработал, почему - не понятно.
Времени разбираться сейчас нет, поэтому сделал по варианту
[1] Соловьев ©

всем спасибо


ЮЮ   (2005-01-13 12:45:00) [2]

>или в  (ADOQuery)?

Остается проверить на ADOTable и ADOStoredProc :)


sniknik   (2005-01-13 12:41:00) [3]

у меня и второй, как и первый вариант работает
 ADOCommand1.ParamCheck:= false;
 ADOCommand1.CommandText:=
   'INSERT INTO ATable (Name) VALUES ('' hjhg'') '+
   'SELECT ? = SCOPE_IDENTITY()';
 ADOCommand1.Parameters.CreateParameter('PVal', ftInteger, pdOutput, 0, 0);
 ADOCommand1.Execute;
 Label1.Caption:= IntToStr(ADOCommand1.Parameters[0].Value);

если не пройдет, то может это в вашем компоненте дело? или в  (ADO Query)?


sniknik   (2005-01-13 12:33:00) [4]

Гаврила ©   (13.01.05 12:06) [5]
хм... проверил (без переписывания компонента правда) работает, счас другой вариант проверю

 ADOCommand1.CommandText:=
   'INSERT INTO ATable (Name) VALUES ('' hjhg'') '+
   'SELECT :PVal = SCOPE_IDENTITY()';
 with ADOCommand1.Parameters[0] do begin
   Direction:= pdOutput;
   DataType:= ftInteger;
 end;
 ADOCommand1.Execute;
 Label1.Caption:= IntToStr(ADOCommand1.Parameters[0].Value);


Гаврила   (2005-01-13 12:06:00) [5]


> [1] Соловьев ©


Как я понял ,в этом случае будет возвращен рекордсет с единственной записью и единственным полем ?

В принципе, это подходит, но что будет со скоростью по сравнению с параметрическим вариантом ?
Если то же самое, то годится, так как для этой операции скорость очень критична (будет вызываться в цикле десятки тысяч раз)
(сравнить скорость не могу так как второй вариант пока не работает)


>  [3] sniknik ©


Я уже потом понял, что с параметрами надо работаать после определения SQL:-), и написал приблизительно то же самое

имеем исключение "строка 1 - некореектный синтаксис около "= "

ParamCheck включен


sniknik   (2005-01-13 11:53:00) [6]

Соловьев ©   (13.01.05 11:45) [1]
а это без параметра, неинтересно... ;)


sniknik   (2005-01-13 11:52:00) [7]

paramcheck включен или выключен?
в любом случае работа с параметром должна быть после внесения запроса (если конечно само внесение не переопределено както по своему)

как вариант (для включенного)
procedure TCustomNBQuery.CreateDBO(const AObject: IDBObject): Variant;
begin
 SQL.Text:= 'Insert into folders (Title, ParentID, Position) Values (''новая папка'', 0, 0) SET :IDParam = SCOPE_IDENTITY()';
 with Parameters[0] do begin
   Direction:= pdOutput;
   DataType:= ftInteger;
 end;
 ExecSQL;

 result:= Parameters[0].Value;
end;


сомневаюсь... (без теста) но попробуй...


Соловьев   (2005-01-13 11:48:00) [8]

сорри забыл :)

select ident_current('folders')


Соловьев   (2005-01-13 11:45:00) [9]

Insert into folders (Title, ParentID, Position) Values (''новая папка'', 0, 0)
select @current_ident('folders')
...

вместо ExecSQL; - Open;


Наверх

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