Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Stream and AdoCommand [D7, MSSQL]


Страницы:   1 2 3

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'


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо