Форум: "Базы";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];
ВнизПередать BLOB (картинка) в ADOQuery Найти похожие ветки
← →
_VaaL_ (2004-01-27 12:30) [0]Не удается передать БЛОБ на 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?
Спасибо.
← →
Sandman25 (2004-01-27 12:34) [1]St.Position := 0 перед LoadFromStream.
Я не вижу присвоения параметров p_img*
← →
_VaaL_ (2004-01-27 12:42) [2]параметр 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)");
← →
_VaaL_ (2004-01-27 12:46) [3]также пробовал вместо ftGraphic писать ftBlob
← →
Sandman25 (2004-01-27 12:51) [4]Я обычно сначала связываю параметр с Query, а только потом присваиваю значение. Хотя, может, это и не принципиально.
← →
_VaaL_ (2004-01-27 13:11) [5]Если не тяжело, хотелось бы мне просто посмотреть ваш пример кода для подобной ситуации. ТОесть TADOQuery + BLOB-параметр.
Спасибо.
← →
_VaaL_ (2004-01-27 13:14) [6]Может быть это глюки "MySQL ODBC 3.51 Driver"?
← →
Val (2004-01-27 13:18) [7]Не работал с адо, но при работе с бде в похожем случае нужно было увеличивать BLOBSIZE в псевдониме до необходимой. Тип параметра укажите ptBlob, параметр создаваете _после_ указания текста запроса.
← →
_VaaL_ (2004-01-27 13:22) [8]Как вариант. Если использовать TADOTable то при установке ADOTable.Active:=true; он потянет на себя все данные (кроме блобов, вроде, походу подтягиваются.) Можно вставлять и через TADOTable но, в отличии от Access-базы которая лежит локально, MySQL сервер удаленный и поэтому охота трафик свести к минимуму.
Зато без параметров :)))
← →
_VaaL_ (2004-01-27 13:23) [9]Val (27.01.04 13:18) сейчас попробую...
← →
_VaaL_ (2004-01-27 13:26) [10]Поднимает исключение EOleException: Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done.
← →
Sandman25 (2004-01-27 13:28) [11][5] _VaaL_ © (27.01.04 13:11)
Примера предоставить не могу. Никогда не работал с ADO. Уж извините :)
← →
_VaaL_ (2004-01-27 13:30) [12]С виду все нестроковые символы заменяются на "?" в БЛОБ поле на MySQL сервере.
Такое впечатление что при вставке этот блоб воспринимается как текстовый а не как binary.
Кстати AV описаный выше появляется именно при вызове ExecSQL
← →
_VaaL_ (2004-01-27 13:34) [13]Вопрос для тех кто работал с ADO:
Можно ли использовать TADOTable только для вставки/редактирования и не тащить на клиента всю таблицу?
← →
sniknik (2004-01-27 13:43) [14]TADOTable это атавизм предназначенный для вымирания, и попутно дл тех кто к нему очень "прикипел" на локальных базах с BDE.
использовать нужно ADODataSet и ADOCommand. для вставки/редактирования замечательно подходит второй.
← →
_VaaL_ (2004-01-27 13:54) [15]Вопрос снят, я дурак :)))))
В ADOQuery есть методы Insert/Edit/Post и для пересылки записи с блобами я просто использую TADOQuery как TADOTable. Тоесть
ADOQuery.Insert;
(ADOQuery.FieldByName("C_Img") as TBlobField).LoadFromFile("c:\tests\a.jpg");
ADOQuery.Post;
Проверил все работает.
Всем спасибо.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.013 c