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

Вниз

пакет команд в 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
14-27192
Shaman_Naydak
2002-08-14 13:17
2002.09.09
Well Known Bugs List


1-26972
Pastor
2002-08-29 14:01
2002.09.09
Перерисовка Canvas а


1-26936
kerkonst
2002-08-27 12:14
2002.09.09
Управление битами


1-27042
lipskiy
2002-08-27 20:56
2002.09.09
Есть ли ф-я для определения контрола по координатам?


14-27184
Riper
2002-08-14 11:44
2002.09.09
WaitCommEvent