![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получения значения 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;