Конференция "Базы" » добавление рисунка в БД из файла [D5, MSSQL]
 
  • KirillRepin © (12.09.08 12:04) [0]
    Подскажите пожалуйста в чем ошибка? рисунок в БД не добавляется.
    процедура в БД:
    CREATE PROCEDURE Proc_AddImage
    @im image
    AS
    BEGIN
     INSERT INTO Tab_Pictures (Pic_Name, Pic)
      VALUES ('picture1', @im)
    END

    GO

    код в дельфи:
     StoredProc1.ParamByName('@im').LoadFromFile('C:\1r.bmp', ftBlob);
     StoredProc1.ExecProc;

    Что сделано не правильно и как надо?
    Заранее благодарен!
  • stas © (12.09.08 12:17) [1]
    А почему решил что недобавляется?
  • KirillRepin © (12.09.08 12:20) [2]
    в базе таблицу смотрел она пустая
  • www (12.09.08 12:22) [3]
    а коммит был ?
  • stas © (12.09.08 12:22) [4]
    И ошибка никакая не пишеться?
  • Ega23 © (12.09.08 12:23) [5]

    > а коммит был ?


    При чём тут коммит?????
  • www (12.09.08 12:28) [6]

    > При чём тут коммит?????

    как причем?!
    а если проверяет наличие данных из другой проги?
  • Ega23 © (12.09.08 12:29) [7]
    1. выбрасываем StoredProcedure. Вообще забудь про этот компонент.
    2. Берём TQuery в случае BDE (тоже лучше забудь про эту технологию) или TADOCommand в случае ADO (это наш выбор!)
    3. Пишем текст exec Proc_AddImage @im=:im
    4. Ставим parameters.ParamByName('im').Paramtype = ftBLOB;
    5. Грузим parameters.ParamByName('im').LoadFrom....
    6. Execute.
  • KirillRepin © (12.09.08 12:29) [8]
    никаких ошибок не всплывает, курсор меняется на sql часы и обратно. внешне кажется что процедура отрабатывает нормально.
  • Ega23 © (12.09.08 12:31) [9]

    > как причем?!
    > а если проверяет наличие данных из другой проги?


    Да хоть откуда.
    Ещё раз: при чём конкретно в этом примере коммит. И где ты его "не видишь"?
  • KirillRepin © (12.09.08 12:33) [10]

    > 1. выбрасываем StoredProcedure. Вообще забудь про этот компонент.

    а чем это хуже TQuery или ADO
  • KirillRepin © (12.09.08 12:34) [11]
    и как это можно решить через StoredProcedure?
  • www (12.09.08 12:34) [12]

    > Ega23 ©   (12.09.08 12:31) [9]

    автор пишет что не видит результата
    чем он его не видит - не сказал
    мож он из какаго-то sql-манагера смотрит который до комита данных их не увидит
  • KirillRepin © (12.09.08 12:38) [13]

    > мож он из какаго-то sql-манагера смотрит который до комита
    > данных их не увидит

    именно из него и QueryAnalizer
  • Ega23 © (12.09.08 12:42) [14]

    > который до комита данных их не увидит


    Ты, вообще, с какой СУБД работаешь?


    > а чем это хуже TQuery или ADO


    Всем. Объяснять - это на пол-дня. В кратце: ADO для MSSQL - родная технология для доступа к данным. Т.е. наиболее оптимальная.
  • Ega23 © (12.09.08 12:44) [15]

    > именно из него и QueryAnalizer
    >


    Набери в QA текст:

    exec Proc_AddImage @im=0xFFFF
    select * from Tab_Pictures



    выдай результат сюда.
  • www (12.09.08 12:44) [16]

    > Ega23 ©   (12.09.08 12:42) [14]

    а что mssql только dirty read поддерживает? или вообще понятие транзакции для нее - мыльный пузырь?
  • Ega23 © (12.09.08 12:48) [17]

    > а что mssql только dirty read поддерживает? или вообще понятие
    > транзакции для нее - мыльный пузырь?
    >


    Для тех кто в танке: где ты видишь открытие транзакции, которую надо коммитить?
  • www (12.09.08 12:53) [18]

    > Для тех кто в танке

    "ты суслика видишь? а он есть"
    телепатор-с
  • KirillRepin © (12.09.08 12:53) [19]

    > выдай результат сюда.


    1 picture1 0xFFFF
  • Ega23 © (12.09.08 12:57) [20]

    > 1 picture1 0xFFFF


    Теперь возьми TQuery, вбей ему SQL =
    еxec Proc_AddImage @im=0xFFFF


    и выполни (ExecSQL). Таблицу предварительно очисти.
    Запись появилась или нет?
  • KirillRepin © (12.09.08 12:58) [21]

    > ADO для MSSQL - родная технология для доступа к данным.
    > Т.е. наиболее оптимальная.

    благодарю за краткое и грамотное объяснение!
    в дальнейшем буду использовать.
    но в данный момент хотелось бы решить вопрос как он есть.
  • stas © (12.09.08 13:07) [22]
    D5,BDE, а MSSQL 2000? в BDE поддержки MSSQL 2000 уже нет, т.е. все нововведения, которые появились в MSSQL 2000 (типы полей в частности) BDE не поддерживает. А это означает что можешь столкнуться еще с другими проблемами. Поэтому лучше ADO.
  • Ega23 © (12.09.08 13:41) [23]

    > т.е. все нововведения, которые появились в MSSQL 2000 (типы
    > полей в частности) BDE не поддерживает


    Хочу услышать, какие типы полей в MSSQL 2000 не поддерживает BDE (за езыг тебя никто не тянул, заметь).
  • stas © (12.09.08 14:00) [24]
    Да как раз с BLOB полями проблемы. И  nvarchar.
    Как работает BDE с новыми типами sql_variant и bigint незнаю, возможно тоже проблематично.
    Но а о переходе на MSSQL 2005 при работе с BDE и разговоров быть неможет.
  • Ega23 © (12.09.08 14:31) [25]

    > Да как раз с BLOB полями проблемы. И  nvarchar.


    Нет никаких проблем. Как с BLOB-ами, так и с nvarchar. 7 лет уже система работает.


    > sql_variant


    Гм... Действительно есть такой тип. А нафига он на клиенте?


    > Но а о переходе на MSSQL 2005 при работе с BDE и разговоров
    > быть неможет.


    Т.е. мне нужно срочно на старую работу письмо отправить, чтобы они всем серверам даунгрейд сделали, т.к. stas ©  сказал, что это работать не может (а почему-то работает)?

    З.Ы. Может хватит чушь пороть?
  • stas © (12.09.08 14:45) [26]
    Ega23 ©   (12.09.08 14:31) [25]
    > 7 лет уже система работает.
    Значит она и с 6.5 работала
    >Т.е. мне нужно срочно на старую работу письмо
    опять же клиент заточен под 6.5.
    т.е. не используются новые возможности.

    И еще вопрос у тебя клиент был написан на D5?
  • KirillRepin © (12.09.08 14:46) [27]
    попробовал с Query выдает ошибку:
    Query1: No SQL statement aviable
  • Ega23 © (12.09.08 14:48) [28]

    > Значит она и с 6.5 работала


    Ну с ней - нет, с 7.0 - да.


    > И еще вопрос у тебя клиент был написан на D5?


    D5, полтора года назад на D7 перевёл.


    > т.е. не используются новые возможности.


    Ясен пень не используются. Поддержка BDE прекращена давным-давно (с D4 вроде). Только это не значит, что оно "не работает".
  • Ega23 © (12.09.08 14:49) [29]

    > Query1: No SQL statement aviable


    О чём это говорит, не догадываешься?
  • KirillRepin © (12.09.08 15:00) [30]
    Сделал так:
    Query1.Close;
    Query1.SQL.Clear;
    Query1.SQL.Add('exec Proc_AddImage @im=0xFFFF');
    Query1.ExecSQL;

    все заработало!

    в БД:
    2 picture1 0xFFFF

    а как теперь с загрузкой из файла быть?-
  • Ega23 © (12.09.08 15:11) [31]

    > Query1.SQL.Clear;
    > Query1.SQL.Add('exec Proc_AddImage @im=0xFFFF');


    Query1.SQL.Text := '.....';




    > а как теперь с загрузкой из файла быть?-


    Я тебе уже выше ответил.
  • stas © (12.09.08 15:26) [32]
    Ega23 ©   (12.09.08 14:31) [25]
    >  Только это не значит, что оно "не работает".


    А я и не писал этого


    > т.е. все нововведения, которые появились в MSSQL 2000 (типы
    > полей в частности)

    А то что работаю программы, которые и с 7-кой работали, то ясно что они и будут работать и на 2008.

    KirillRepin ©   (12.09.08 15:00) [30]
    А твоя проблема в том что на BLOB нужно в алиасе BDE устанавливать максимальный размер, который по умолчанию меньше чем твоя картинка.
  • KirillRepin © (12.09.08 15:33) [33]
    Все получилось! спасибо большое за помощь в решении моей проблемы!
  • sniknik © (12.09.08 15:34) [34]
    > З.Ы. Может хватит чушь пороть?
    это не чушь, действительно встречал предупреждения (и не где нибудь в инете, а в официальной доке) о прекращении поддержки с версии 6,5 или 7 и потому работа на более старшей версии не гарантируется...
    единственное о чем он не упомянул, это о том, что речь там шла о "нативном" BDE-шном драйвере(/линке), а не о чем то другом, вроде ODBC, поддержка которого продолжалась существенно дольше.

    и насколько понимаю все успешно работающие проекты на BDE используют именно ODBC, т.к. иначе проблемы были бы наверняка.
    вот ты что используешь в том на что ссылаешься?
  • stas © (12.09.08 15:34) [35]
    KirillRepin ©   (12.09.08 15:33) [33]
    Ты хоть напиши что сделал.
  • KirillRepin © (12.09.08 15:38) [36]
    Query1.Close;
    Query1.SQL.Clear;
    Query1.SQL.Text := 'exec Proc_AddImage @im=:im';
    Query1.ParamByName('im').LoadFromFile('C:\bear.bmp', ftBlob);
    Query1.ExecSQL;

    Мне теперь интересно а как загрузить из TImage?
  • www (12.09.08 15:47) [37]

    > Мне теперь интересно а как загрузить из TImage?

    loadfromstream
  • Ega23 © (12.09.08 16:03) [38]

    > вот ты что используешь в том на что ссылаешься?


    ODBC, конечно. Откровенно говоря, ни разу не видел, чтобы кто-то именно на BDE-шном драйвере что-то делал. Ну если только ОЧЕНЬ давно...
  • KirillRepin © (12.09.08 16:31) [39]
    Подскажите пожалуйста, а загрузить из БД обратно в TImage как?
    как я понимаю это SaveToStream вот только немогу сформировать нормально код. Вот что делаю я:
    var
     s:TMemoryStream;
    begin
     s:=TMemoryStream.Create;
     Query1.Close;
     Query1.SQL.Clear;
     Query1.SQL.Text := 'SELECT Pic FROM Tab_Pictures WHERE Id_Pictures = 4';

     Query1.ExecSQL;

    end;

    Что не так? и как правильно воткнуть и куда SaveToStream ?
  • stas © (12.09.08 16:57) [40]
    TBlobField.SaveToStream ()
 
Конференция "Базы" » добавление рисунка в БД из файла [D5, MSSQL]
Есть новые Нет новых   [134435   +34][b:0][p:0.001]