Форум: "Базы";
Текущий архив: 2002.09.09;
Скачать: [xml.tar.bz2];
Внизпакет команд в MS SQL из Delphi 5 Найти похожие ветки
← →
Guest_xxx (2002-08-20 11:11) [0]Как из Delphi выполнить пакет, состоящий более чем из одной команды?
Сейчас пишу что-то типа
declare @myid int
select @myid = ident_current("table")
insert into table2 vaues (@myid, ...) etc.
Далее все это пихаю в CommandText своего ADOCommand, а он ругается, типа "Access violation or syntax error"...
Что делать?
← →
3JIA9I CyKA (2002-08-20 11:20) [1]go убрал?
← →
Guest_xxx (2002-08-20 11:25) [2]Зачем он нужен? Я же тогда свою переменную потеряю...
← →
sniknik (2002-08-20 11:40) [3]тебе пишут что синтакс еррор вот и ищи ошибки (это к вопросу что делать)
declare @myid int
select @myid = ident_current("table1")
insert into table1 (id) values (@myid)
← →
MOA (2002-08-20 12:10) [4]Извините, что несколько не по теме, но...
1. Мне кажется, конструкция
declare @myid int
select @myid = ident_current("table1")
insert into table1 (id) values (@myid)
годится, если Вы хотите в таблице table1 накапливать некую статистику вставленных записей. Если же Вы при помощи конструкции
select @myid = ident_current("table1")
пытаетесь выяснить последний присвоенный Вашей предыдущей записи Identity, то Вы не получите того, на что, возможно, надеетесь. ident_current("table1") возвращает последний Identity, присвоенный полю во всех сеансах, что при многопользовательской работе (а у нас ведь именно она, SQL Server все-таки) не то, что нужно.
2. Попробуйте воспользоваться хранимой процедурой - они придуманы именно для подобных целей. Получите массу выигрышей.
Удачи!
← →
Guest_xxx (2002-08-20 12:16) [5]Хорошо, перефразируем вопрос. Как использовать переменные в запросах?
Блок1
Add("declare @myid int ");
Add("select @myid = @@IDENTITY");
Add("print @myid");
Блок2
Add("insert into income_details ");
Add("(i_id, id_vagon, id_density_fact, id_massa_fact, id_volume_fact, ");
Add("id_density_doc, id_massa_doc, id_volume_doc) ");
Add(" values" );
Add("(14, :vagon, :density_fact, :massa_fact, ");
Add(":volume_fact, :density_doc, :massa_doc, :volume_doc) ");
У меня блоки 1 и 2 друг без друга отрабатывают, а вот вместе не хотят!
← →
guest_xxx (2002-08-20 12:21) [6]MOA: да, спасибо. Именно это и нужно. Но ведь это не является причиной ошибки? Если написать SCOPE_IDENTITY() вместо ident_current() то все по-прежнему не идет, хотя SCOPE_IDENTITY() здесь более уместно... Хочется уж разобраться...
← →
guest_xxx (2002-08-20 12:39) [7]Судя по всему парамеризованные запросы в этом случае не проходят...
← →
sniknik (2002-08-20 12:56) [8]print @myid из блока убери. зачем он?
парамеризованные запросы не проходят? это почему с точки зрения MSSQL он такойже ведь он получает строку со вставленными значениями.
так для иформации в первом посте у меня рабочий запрос (проверял) а у тебя только значений больше. иди от простого к сложному а не наоборот.
← →
MOA (2002-08-20 13:01) [9]Честно сказать, пользуюсь в подобных случаях хранимыми процедурами на сервере. Но все же, попробуем разобраться...
Вот сейчас прямо, кинул на форму TADOConnection, TADOCommand, текст запроса:
DECLARE @p Integer
SELECT @p = SCOPE_IDENTITY()
PRINT @p -- кстати, зачем?
SELECT @p, @p
SELECT @p, @p, :Par
Execute срабатывает (что получается - не смотрел).
У Вас компонента именно TADOCommand? (тогда с PRINT сложности ;)
Посмотрите профилировщиком - команды проходят? Или Дельфи их даже не выполняет?
← →
guest_xxx (2002-08-20 14:08) [10]Приведу фрагмент кода
ac := TADOCommand.Create(Self);
ac.Connection := DM.ADOConnection;
sl := TStringList.Create;
with sl do
begin
Add("declare @myid integer ");
Add("select @myid = IDENT_CURRENT(" + """" + "income" + """" + ")");
Add("insert into income_details ");
Add("(i_id, id_vagon, id_density_fact, id_massa_fact, id_volume_fact, ");
Add("id_density_doc, id_massa_doc, id_volume_doc) ");
Add(" values " );
Add("(@myid, :vagon, :density_fact, :massa_fact, ");
Add(":volume_fact, :density_doc, :massa_doc, :volume_doc)");
ac.CommandText := sl.Text;
end;
ac.Prepared := True;
ac.Parameters.ParamByName("vagon").Value := "0";
ac.Parameters.ParamByName("density_fact").Value := 0;
ac.Parameters.ParamByName("massa_fact").Value := 0;
ac.Parameters.ParamByName("volume_fact").Value := 0;
ac.Parameters.ParamByName("density_doc").Value := 0;
ac.Parameters.ParamByName("massa_doc").Value := 0;
ac.Parameters.ParamByName("volume_doc").Value := 0;
ac.Execute;
DM.ADOConnection.CommitTrans;
я тут лишнее все выкинул, но он не работает по-прежнему... =(
← →
guest_xxx (2002-08-20 14:12) [11]Опять же, если вставлять конкретные значения в текст самого запроса, то все работает отлично, а с параметрами не хочет!
← →
MOA (2002-08-20 15:07) [12]Уберите
ac.Prepared := True;
Удачи!
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.09.09;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c