Здравствуйте, _spin_, Вы писали:
__>Всем доброго времени суток!
__>Пишу xp_ которая должна побайтно разобрать файл и нужные данные поместить в таблицу БД.
__>С соданием, подключением к СУБД и работой с файлами всё понятно.
__>Вопрос следующий: как из расширенной процедуры внести данные в таблицу (или вообще работать с таблицами БД)?
Что то вспоминается овставке из сторед процедуры:
INSERT INTO MyTable (Field1, Field2)
EXEC XP_MyProc param1, param2
Остальное в хелпах как и почему вызывать srv_rpcparams, srv_setcollen, srv_setcoldata, srv_sendrow, srv_senddone, давно это было
Тем более в инете есть много врапперов облегчающих жизнь дельфиста. Гуглите...
Здравствуйте, Danchik, Вы писали:
D>Что то вспоминается овставке из сторед процедуры: D>
D>INSERT INTO MyTable (Field1, Field2)
D>EXEC XP_MyProc param1, param2
D>
D><skipped, sorry>
Это я знаю, но это не подходит.
Возможно, я неправильно выразился. Хочется работать с данными непосредственно из кода процедуры, т.е. из Delphi, а не обрабатывать результаты работы процедуры на T-SQL.
Просто там больше семидесяти полей надо заполнить для каждого файла, их все описывать для передачи в MSSQL — муторно. Хочется более красивого решения.
... <<#1 — 04 Vivid 10 000 (Jazzy lounge mix)>>
Не восхрапи на работе, ибо храпом своим разбудишь начальника своего.
[Skip]
__>Это я знаю, но это не подходит.
__>Возможно, я неправильно выразился. Хочется работать с данными непосредственно из кода процедуры, т.е. из Delphi, а не обрабатывать результаты работы процедуры на T-SQL.
Вы имеете в виду Debug в Delphi, а не смотреть результат запроса? Могу посоветовать как провести такой Debug.
__>Просто там больше семидесяти полей надо заполнить для каждого файла, их все описывать для передачи в MSSQL — муторно. Хочется более красивого решения.
Тоесть у Вас красивым решением является привязать XP к определенной таблице намертво...
70 полей описать один раз, помоему малая из зол которую необходимо будет решить при написании процедуры, которая вставляет в реальную таблицу.
Кстати что процедура должна делать то? И абстрагируемся от функциональности "вставка данных" до понятия "вернуть набор данных", который необходимо вставить в определенную таблицу.
Здравствуйте, Danchik, Вы писали:
D>Вы имеете в виду Debug в Delphi, а не смотреть результат запроса? Могу посоветовать как провести такой Debug.
Нет, как юзать Debug для XP я знаю.
D>Тоесть у Вас красивым решением является привязать XP к определенной таблице намертво...
Вариант с INSERT — тоже "мёртвая" привязка, в общем-то. Не в этом суть. Просто не хочу распылять логику работы между Delphi и T-SQL.
D>70 полей описать один раз, помоему малая из зол которую необходимо будет решить при написании процедуры, которая вставляет в реальную таблицу.
Согласен. Но таблица есть и с ней надо работать.
D>Кстати что процедура должна делать то?
Процедура выполняет разбор сообщения электронной почты. Каждое сообщение кроме стандарнтых полей заголовка RFC-822 имеет ещё ряд полей, используемых для внутренних нужд компании. Дополнительные поля закриптованы и закрыты Base64. Процедура снимает Base64, снимает криптор, разбирает файл по полям, анализирует содержание. В результате работы процедуры формируется некий кортеж значений, однозначно идентифицирующий данное сообщение и его содержание в системе документооборота компании.
D>И абстрагируемся от функциональности "вставка данных" до понятия "вернуть набор данных", который необходимо вставить в определенную таблицу.
Кортеж (см. выше) и будет возвращаемым набором данных. Только вот этот набор я хочу вставить в определённую таблицу средствами Delphi, а не T-SQL.
... <<#2 — 03 Duble inc. Tango forte>>
Не восхрапи на работе, ибо храпом своим разбудишь начальника своего.
[Skip]
D>>И абстрагируемся от функциональности "вставка данных" до понятия "вернуть набор данных", который необходимо вставить в определенную таблицу.
__>Кортеж (см. выше) и будет возвращаемым набором данных. Только вот этот набор я хочу вставить в определённую таблицу средствами Delphi, а не T-SQL.
Хм, я че то не понимаю в понятиях красоты реализации... ну да ладно.
Если вас всетаки тянет вставлять данные именно сторед процедурой. То сценарий приблизительно такой:
var
aToken : array [0..255] of Char;
ADOCommand : TADOCommand;
begin
ZeroMemory (@aToken, SizeOf (aToken));
srv_getbindtoken (proc, @aToken) - получаем токен текущей сесси
ADOCommand := TADOCommand.Create (nil);
try
ADOCommand.ConnectionString := {придется передавать};
ADOCommand.Connected := True;
ADOCommand.Execute (Format ('exec sp_bindsession ''%s''', [string (aToken)]));
{ Ну и вставляем через ADO все что нам влезет.}finally
ADOCommand.Free;
end;
Думаю красоты тут не прибавилось, а вот скорость упала. What do you think?
Другого способа я незнаю Srv.h (Open Data Services header file) более низкоуровневых процедур не имеет.
Здравствуйте, Danchik, Вы писали:
D>Хм, я че то не понимаю в понятиях красоты реализации... ну да ладно.
Проехали.
D>Если вас всетаки тянет вставлять данные именно сторед процедурой. То сценарий приблизительно такой: D><code skipped> D>Думаю красоты тут не прибавилось, а вот скорость упала. What do you think?
Да уж, не самое быстрое решение. Я так делал, почти -10% от скорости. Получается уродливая смесь ODS API и ADO-классов.
D>Другого способа я незнаю Srv.h (Open Data Services header file) более низкоуровневых процедур не имеет.
Очень жаль, я тоже пока не нашел. Значит буду делать обёртку на T-SQL и описывать все параметры. Хоть и муторно, но немного более гибко.
Спасибо за ответы!
Удачи нам...
... <<#3 — 08 Grant Nelson Free>>
Не восхрапи на работе, ибо храпом своим разбудишь начальника своего.
Здравствуйте, _spin_, Вы писали:
__>Всем доброго времени суток!
__>Пишу xp_ которая должна побайтно разобрать файл и нужные данные поместить в таблицу БД.
__>С соданием, подключением к СУБД и работой с файлами всё понятно.
__>Вопрос следующий: как из расширенной процедуры внести данные в таблицу (или вообще работать с таблицами БД)?
Со строками помоему никак. можно вернуть результат в переменную любого типа. я такую проблему решал так:
загонял данные в блоб или строковую переменную в виде XML-структуры, далее в хранимой разбирал эту структуру и рассовывал по нужным полям.
Правда база у меня была для Interbase. Но думаю в умелых руках принцып можно переложить и на МСсиквел.
можешь в этой структуре хранить как значения, так и имена полей, куда это нужно вписать.
подробнее можно почитать здесь.
Здравствуйте, svd71, Вы писали:
S>загонял данные в блоб или строковую переменную в виде XML-структуры, далее в хранимой разбирал эту структуру и рассовывал по нужным полям.
Вариант, но не подходит — сильно падает быстродействие.
... <<#2 — 10 Majbour Cheops>>
Не восхрапи на работе, ибо храпом своим разбудишь начальника своего.