Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.008 c
7-53795
revo
2003-12-02 17:14
2004.02.17
crc16 и modbus


1-53588
Сибулбо
2004-02-08 12:08
2004.02.17
Dos>Win кодировка


8-53646
kvp
2003-10-20 12:52
2004.02.17
Повернуть элипс на произвольный угол


1-53580
nester
2004-02-07 05:10
2004.02.17
Как файл впихнуть в сам exe-шник, чтобы потом извлечь


6-53681
hort
2003-11-11 21:49
2004.02.17
WAP-приложение.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский