Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-27017
nic418
2002-08-30 05:01
2002.09.09
---|Ветка была без названия|---


6-27154
andrey_pst
2002-07-02 15:55
2002.09.09
Отправка файлов по e-mail


1-27075
alexias
2002-08-28 12:47
2002.09.09
Отображение формул


1-26996
CrazyHackers
2002-08-29 15:43
2002.09.09
Поиск - Замена


3-26884
BJValentine
2002-08-19 16:05
2002.09.09
Параметр в запросе





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский