Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.17;
Скачать: CL | DM;

Вниз

Передать 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.017 c
1-53558
Relaxxx
2004-02-09 12:51
2004.02.17
Возможно ли как-то связать два датаСета и отображать их...


3-53396
coder
2004-01-27 07:16
2004.02.17
DBGrid


3-53391
Александр
2004-01-26 22:28
2004.02.17
Ребята помогите, а то диплому хана. (на тему таблиц Paradox)


1-53545
Алхимик
2004-02-05 13:07
2004.02.17
TOpenDialog & Dll


7-53775
frost
2003-12-02 13:03
2004.02.17
Диск A и CD