Текущий архив: 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.46 MB
Время: 0.024 c