Главная страница
    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.46 MB
Время: 0.024 c
1-1107252218
markers
2005-02-01 13:03
2005.02.13
Права доступа


3-1105945660
Floppy
2005-01-17 10:07
2005.02.13
Как определить общее количество страниц


1-1107075190
Зигмунд
2005-01-30 11:53
2005.02.13
Как закодировать строчку в URL-кодированную.


3-1105613123
Stanislav
2005-01-13 13:45
2005.02.13
Аварийная остановка программы


3-1105452134
CRACKISH
2005-01-11 17:02
2005.02.13
Count и DbGrid?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский