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

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

Передать BLOB (картинка) в ADOQuery [D7, MySQL, Access]


_VaaL_ ©   (2004-01-27 12:30:00) 

Не удается передать БЛОБ на MySQL-базу с Access базы. Изображение бьется. Попробовал Передавать БЛОБ параметром, так можна? И где ошибка?
Вот пример кода:
St - TMemoryStream
MySQLQry - TADOQuerty, подключенный через "MySQL ODBC 3.51 Driver"
ADOGroupQry - TADOQuerty в котором 1 запись для передачи на MySQL сервер
P - TParameter

КОД:
P:=MySQLQry.Parameters.CreateParameter("p_img", ftGraphic, pdInput, 1, "");
(ADOGroupQry.FieldByName("C_Img") as TBlobField).SaveToStream(St);
P.LoadFromStream(St, ftGraphic);
St.Clear;
MySQLQry.SQL.Add("INSERT INTO commodity (C_ID, C_G_ID, C_Art, C_Name, C_Desc, C_Img) VALUES ("+
IntToStr(Elem.ID)+", "+
ADOGroupQry.FieldByName("C_G_ID").AsString +", """+
ADOGroupQry.FieldByName("C_Art").AsString +""", "+
":p_name, :p_desc, :p_img, :p_img_big)");
try
MySQLQry.ExecSQL;
except
Result:=1;
exit;
end;

Инициализацию p_name, p_desc параметров не привожу так как они текстовые и проблем с ними нету.
Прога отрабатывает, никаких ошибок нету. Но в блобах на MySQL сервере - каша а не картинка. Неужели нет возможности передавать БЛОБЫ в TADOQuery?
Спасибо.


_VaaL_   (2004-01-27 13:54:00) [1]

Вопрос снят, я дурак :)))))
В ADOQuery есть методы Insert/Edit/Post и для пересылки записи с блобами я просто использую TADOQuery как TADOTable. Тоесть

ADOQuery.Insert;
(ADOQuery.FieldByName("C_Img") as TBlobField).LoadFromFile("c:\tests\a.jpg");
ADOQuery.Post;


Проверил все работает.
Всем спасибо.


sniknik   (2004-01-27 13:43:00) [2]

TADOTable это атавизм предназначенный для вымирания, и попутно дл тех кто к нему очень "прикипел" на локальных базах с BDE.

использовать нужно ADODataSet и ADOCommand. для вставки/редактирования замечательно подходит второй.


_VaaL_   (2004-01-27 13:34:00) [3]

Вопрос для тех кто работал с ADO:

Можно ли использовать TADOTable только для вставки/редактирования и не тащить на клиента всю таблицу?


_VaaL_   (2004-01-27 13:30:00) [4]

С виду все нестроковые символы заменяются на "?" в БЛОБ поле на MySQL сервере.
Такое впечатление что при вставке этот блоб воспринимается как текстовый а не как binary.

Кстати AV описаный выше появляется именно при вызове ExecSQL


Sandman25   (2004-01-27 13:28:00) [5]

[5] _VaaL_ © (27.01.04 13:11)

Примера предоставить не могу. Никогда не работал с ADO. Уж извините :)


_VaaL_   (2004-01-27 13:26:00) [6]

Поднимает исключение EOleException: Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done.


_VaaL_   (2004-01-27 13:23:00) [7]

Val (27.01.04 13:18) сейчас попробую...


_VaaL_   (2004-01-27 13:22:00) [8]

Как вариант. Если использовать TADOTable то при установке ADOTable.Active:=true; он потянет на себя все данные (кроме блобов, вроде, походу подтягиваются.) Можно вставлять и через TADOTable но, в отличии от Access-базы которая лежит локально, MySQL сервер удаленный и поэтому охота трафик свести к минимуму.
Зато без параметров :)))


Val   (2004-01-27 13:18:00) [9]

Не работал с адо, но при работе с бде в похожем случае нужно было увеличивать BLOBSIZE в псевдониме до необходимой. Тип параметра укажите ptBlob, параметр создаваете _после_ указания текста запроса.


_VaaL_   (2004-01-27 13:14:00) [10]

Может быть это глюки "MySQL ODBC 3.51 Driver"?


_VaaL_   (2004-01-27 13:11:00) [11]

Если не тяжело, хотелось бы мне просто посмотреть ваш пример кода для подобной ситуации. ТОесть TADOQuery + BLOB-параметр.
Спасибо.


Sandman25   (2004-01-27 12:51:00) [12]

Я обычно сначала связываю параметр с Query, а только потом присваиваю значение. Хотя, может, это и не принципиально.


_VaaL_   (2004-01-27 12:46:00) [13]

также пробовал вместо ftGraphic писать ftBlob


_VaaL_   (2004-01-27 12:42:00) [14]

параметр p_img создается:
P:=MySQLQry.Parameters.CreateParameter("p_img", ftGraphic, pdInput, 1, "");

картинка сохраняется в поток из другого рекордсета:
(ADOGroupQry.FieldByName("C_Img") as TBlobField).SaveToStream(St);
потом картинка грузится в параметр:
St.Position:=0;
P.LoadFromStream(St, ftGraphic);

параметр указан в запросе:
MySQLQry.SQL.Add("INSERT INTO commodity (C_ID, C_G_ID, C_Art, C_Name, C_Desc, C_Img) VALUES ("+
...+", "+
... +", """+
... +""", "+
":p_name, :p_desc, :p_img, :p_img_big)");


Sandman25   (2004-01-27 12:34:00) [15]

St.Position := 0 перед LoadFromStream.
Я не вижу присвоения параметров p_img*


Наверх

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