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

Вниз

Получения значения OUT параметра   Найти похожие ветки 

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

Доброго времени суток
имеем базу на 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 11:45) [1]

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

вместо ExecSQL; - Open;


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

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

select ident_current("folders")


 
sniknik ©   (2005-01-13 11:52) [3]

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;


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


 
sniknik ©   (2005-01-13 11:53) [4]

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


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


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


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

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


>  [3] sniknik ©


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

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

ParamCheck включен


 
sniknik ©   (2005-01-13 12:33) [6]

Гаврила ©   (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);


 
sniknik ©   (2005-01-13 12:41) [7]

у меня и второй, как и первый вариант работает
 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);

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


 
ЮЮ ©   (2005-01-13 12:45) [8]

>или в  (ADOQuery)?

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


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

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

всем спасибо



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

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

Наверх




Память: 0.49 MB
Время: 0.025 c
1-1106929868
Боян Георгиев
2005-01-28 19:31
2005.02.13
OnMouseMove := ShapeMouseOver;


3-1105607387
Yurisimus
2005-01-13 12:09
2005.02.13
Посоветуйте хороший DBGrid


14-1106243813
madmouse
2005-01-20 20:56
2005.02.13
Вопрос


9-1099762184
Sphinx
2004-11-06 20:29
2005.02.13
Загрузка BMP


14-1106314154
Kerk
2005-01-21 16:29
2005.02.13
реальная история одной знакомой.