![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Stream and AdoCommand [D7, MSSQL]
Viod © (2008-07-11 11:40:00)Здравствуйте!
Есть такая задача: нужно сохранить rtf файл в базу данных, затем из базы данных получить и загрузить в редактор.
rtf передается в поток TMymoryStream.
Для записи в базу данных используется хранимая процедура типа:
@code image
AS
INSERT INTO temp_table(code) VALUES(@code)
-----------------------------------------------------
var mystream:Tmemorystream; // сюда передаю rtf
Пользуюсь компонентом ADOCommand
ADOCommand1.CommandType:=cmdStoredProc;
ADOCommand1.CommandText:='p_inferno_temp2;1';
ADOCommand1.Parameters.Clear;
ADOCommand1.Parameters.Add;
ADOCommand1.Parameters[0].Direction:=pdInput;
ADOCommand1.Parameters[0].Name:='@code'; ADOCommand1.Parameters[0].LoadFromStream(mystream,ftBlob);
Параметру не передается значение из потока.
такой вариант записи в базу вобще возможен?
Viod (2008-07-28 11:08:00) [21]sniknik, а че плохо чтоле? Получил 0 - работай, получил -1 не работай.
А если тебе нужно по сложному алгоритму что-то из базы получать. Клиентская машина итак еле шевелится. Перекладываешь все на SQL'ник и все. Код в дельфи прилично выглядит: не приходится запросы писать, а они ведь бывают очень длинными. Да и потом хранимые процедуры и с представлениями могут работать.. Попробуй ка все в делфи впихнуть :)
А проверки в хранимых процедурах... пустой набор записей когда возвращается - тоже вроде не очень приятно?
Viod (2008-07-28 11:08:00) [22]sniknik, а че плохо чтоле? Получил 0 - работай, получил -1 не работай.
А если тебе нужно по сложному алгоритму что-то из базы получать. Клиентская машина итак еле шевелится. Перекладываешь все на SQL'ник и все. Код в дельфи прилично выглядит: не приходится запросы писать, а они ведь бывают очень длинными. Да и потом хранимые процедуры и с представлениями могут работать.. Попробуй ка все в делфи впихнуть :)
А проверки в хранимых процедурах... пустой набор записей когда возвращается - тоже вроде не очень приятно?
Viod (2008-07-28 11:03:00) [23]Ниче не вернет если нот ексистс проверено :)
Ega23 (2008-07-28 11:01:00) [24]
> в любом случае возвращается.
IF EXISTS(select .......)
BEGIN
SELECT ...........
RETURN 0
END
ELSE RETURN -1
Где тут НД возвращается, если not exists?
Viod (2008-07-28 11:00:00) [25]просто хочется всю безопасность со своего кода на sql переложить
sniknik (2008-07-28 10:53:00) [26]> В одном случае НД возвращается, а в другом - нет.
в любом случае возвращается.
sniknik (2008-07-28 10:51:00) [27]реально но большого смысла нет.
AdoCommand как результат возвращает рекордсет т.что можно выполнить в нем и вытаскивать блоб из результирующего рекордсета если он не пустой (рекордсет возвращается в любом случае, просто по пустому в твоем случае уже ADODataSet генерит исключение, а до этого ты сам в процедуре делишь по проверке на пустой и нет... сплошные проверки в общем)
имхо, то что ты делаешь и в процедуру то "заворачивать" смысла нет... (как и 90% написанных sql процедур, их пишут не потому что они действительно нужны, а потому что начинающему сказали что это "круто"/правильно/лучше/удобнее(?)/...)
Viod (2008-07-28 10:50:00) [28]так вот интересно.
rec:_recordset;
rec:=AdoCommand.execute;
Это вобще правильно или нет?
Ega23 (2008-07-28 10:47:00) [29]
> Ну а чисто теоретически с AdoCommand реально?
Реально. _RecordSet же есть.
Но не советую. В смысле, как у тебя запрос был сформирован. В одном случае НД возвращается, а в другом - нет. Причём заранее определить нельзя - вернётся он или нет.
Это потенциальная дыра.
Viod (2008-07-28 10:42:00) [30]Ясно... Ну а чисто теоретически с AdoCommand реально?
Ega23 (2008-07-28 10:18:00) [31]
> Хранимая процедура выглядит так:
А не надо так делать. Возвращай Select в любом случае. т.е. вместо
IF EXISTS(select .......)
BEGIN
SELECT ...........
RETURN 0
END
ELSE RETURN -1
делай
SELECT .....
RETURN 0
А вот на клиенте уже проверяй:
with DataSet do
begin
try
Open;
if IsEmpty then .... // <- записей нет
else .... // <- записи есть
except
....
end;
end;
Viod (2008-07-28 10:09:00) [32]А вот такой вопрос: для того чтобы вытащить из базы blob поле в Stream мы используем ADODataSet. По методу Open он как я понимаю должен вернуть набор записей. А если записи не вернулись, тоесть хранимая процедура не вернула набор записей - дебаггер оворит, что все плохо :)
Хранимая процедура выглядит так:
IF EXISTS(select .......)
BEGIN
SELECT ...........
RETURN 0
END
ELSE RETURN -1
Так вот когда RETURN -1, тогда Open сделать не выходит...
Как обработать этот случай. Или как получить blob с помощью AdoCommand.
ПробовалAdoCommand.Execute.Fields[номер поля].valueвроде возвращает обычные типы данных а вот blob не хочет
Ega23 (2008-07-14 19:43:00) [33]
> Хм... а почему goto, а не else?
Это лишь шаблон, там этих @AcNam до чёртиков может быть.
Короче, привык так... :)
Anatoly Podgoretsky (2008-07-14 11:50:00) [34]
> Имени не будет... Так процедуры хранимые переписывать придется
> при переводе на новую версию сервера?
Возможно и придется, имя типа будет другое.
clickmaker (2008-07-14 11:12:00) [35]> if @ActNam='SEL'
> begin
> Select code from temp_table;
> Goto Fin;
> end;
Хм... а почему goto, а не else?
Viod (2008-07-14 10:01:00) [36]Да не то чтобы пользуюсь - услышал и спросил по быстрому.
Имени не будет... Так процедуры хранимые переписывать придется при переводе на новую версию сервера?
Anatoly Podgoretsky (2008-07-14 08:35:00) [37]> Viod (14.07.2008 6:17:08) [8]
Тип будет, имени не будет.
А зачем слухами пользуешься?
Viod (2008-07-14 06:17:00) [38]А еще такой вопросик, не стал новую тему создавать...
Слышал, что в новых версиях msSQL не будет типа данных image. На сколько эти слуи - правда?
Viod (2008-07-11 13:42:00) [39]Круто, сейчас у меня глаза на место встанут (они на стол выпали), и я разберусь..
Пока все временное, просто пробую - потом конечно все это обрастет кодом ;)
Спасибо за точный и быстрый ответ
Ega23 (2008-07-11 13:32:00) [40]
> Так будет работать?
>
Да.
Только я бы сделал такую процедуру:
CREATE PROCEDURE s_temp_table
@ActNam varchar(32)='NONE',
@Code image =NULL
AS
Declare @result int;
Set NoCount On;
Set @ActNam=LTrim(RTrim(Upper(@ActNam)));
Set @result=0;
if @ActNam='SEL'
begin
Select code from temp_table;
Goto Fin;
end;
if @ActNam='ADD'
begin
Insert into temp_table (code) Values (@code);
Goto Fin;
end;
FIN:
return(@result);
GO
Ну и вызов в случае добавления - exec s_temp_table @ActNam='ADD', @code=:code
выборки - exec s_temp_table @ActNam='SEL'