![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передать 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*