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

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

BLOB и параметрический запрос [D7, MySQL]


Страницы:   1 2 3

совсем чайник ©   (2007-02-21 13:30:00) 

Здравствуйте, использую dbexpress и Mysql
Мне необходимо в запросе добавить в BLOB поле картинку.
Воспользовавшись примером на данном форуме написал такой код:


if rra.image<>'' then
 begin
   fproc.q1.SQL.Text:=fproc.q1.SQL.Text+',sepcimage= '':paramblob''';
   p:=tparam.Create(nil);
   p.Name:='paramblob';
   fproc.q1.Params.AddParam(p);
   fproc.q1.ParamByName('paramblob').DataType := ftBlob;
   fproc.Q1.ParamByName('paramblob').ParamType := ptInput;
   fproc.Q1.ParamByName('paramblob').LoadFromFile(rra.image,ftBlob);
 end;
try
 fproc.q1.ExecSQL(true);
 result:=0;
except
 result:=1;

И в результате значения параметра paramblob в BLOB поле добавляется просто ':paramblob' т.е. просто строчка...
Скажите пожалуйста почему так ? и как это исправить ?


совсем чайник   (2007-02-22 12:46:00) [21]

Извиняюсь. Первый вариант:

sql.Connected:=true;
q1.SQL.Clear;
q1.SQL.Add('insert into test1 (im) values (:paramb)');
q1.ParamByName('paramb').ParamType := ptInput;
q1.ParamByName('paramb').DataType := ftinteger;
q1.ParamByName('paramb').AsInteger:=2;
q1.ExecSQL(true);
sql.Connected:=false;


Project Project14.exe raised exception class EDatabaseError with message 'dbExpress Error: [0x0001]: Warning
Database Server Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL
server version for the right syntax to use near ':paramb)' at line 1'.


совсем чайник   (2007-02-22 12:45:00) [22]

Первый вариант:

sql.Connected:=true;
q1.SQL.Clear;
q1.SQL.Add('insert into set test1=:paramb');
q1.ParamByName('paramb').ParamType := ptInput;
q1.ParamByName('paramb').DataType := ftinteger;
q1.ParamByName('paramb').AsInteger:=2;
q1.ExecSQL(true);
sql.Connected:=false;


Project Project14.exe raised exception class EDatabaseError with message 'dbExpress Error: [0x0001]: Warning
Database Server Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL
server version for the right syntax to use near 'set test1=:paramb' at line 1'.

Второй вариант:

sql.Connected:=true;
q1.SQL.Clear;
q1.SQL.Add('insert into (test1) values (:paramb)');
q1.ParamByName('paramb').ParamType := ptInput;
q1.ParamByName('paramb').DataType := ftinteger;
q1.ParamByName('paramb').AsInteger:=2;
q1.ExecSQL(true);
sql.Connected:=false;


Project Project14.exe raised exception class EDatabaseError with message 'dbExpress Error: [0x0001]: Warning
Database Server Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL
server version for the right syntax to use near '(test1) values (:paramb)' at line 1'.


Reindeer Moss Eater   (2007-02-22 12:40:00) [23]

Кстати классический у меня тоже не прокатывает.


Desdechado   (2007-02-22 12:38:00) [24]

> Похоже блобы через dbExpress можно вставить только через
> редактируемый датасет.
Спокойно вставлял и обычной INSERT-командой.

Автору
Не мудри и используй классический синтаксисINSERT. Вполне возможно, что альтернативный имеет ограничения или не проходит по версии MySQL, которых как риса в мешке и все разные.


совсем чайник   (2007-02-22 12:37:00) [25]

Собственно дело даже не в BLOB такая ошибка на любой тип параметра


совсем чайник   (2007-02-22 11:56:00) [26]

Project Project14.exe raised exception class EDatabaseError with message 'dbExpress Error: [0x0001]: Warning
Database Server Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL
server version for the right syntax to use near ':paramb)' at line 1'.


совсем чайник   (2007-02-22 11:56:00) [27]

Текст проекта был, разумеется, тот, который вы указали в [26]


Johnmen   (2007-02-22 11:54:00) [28]

sql.Connected:=true;
q1.SQL.Clear;
q1.SQL.Add('insert into test1 (im) values (:paramb)');
q1.ParamByName('paramb').ParamType := ptInput;
q1.ParamByName('paramblob').DataType := ftBlob;
q1.ParamByName('paramb').LoadFromFile('c:\1.jpg',ftblob);
q1.ExecSQL(true);
sql.Connected:=false;


совсем чайник   (2007-02-22 11:41:00) [29]

сделал тестовый проект:

sql.Connected:=true;
q1.SQL.Add('insert into test1 (im) values (:paramb)');
q1.ParamByName('paramb').LoadFromFile('c:\1.jpg',ftblob);
q1.ExecSQL(true);
sql.Connected:=false;

ошибка при выполнении:
Project Project14.exe raised exception class EDatabaseError with message 'dbExpress Error: [0x0001]: Warning
Database Server Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL
server version for the right syntax to use near ':paramb)' at line 1'.

содержание объекта q1:
 object q1: TSQLQuery
   MaxBlobSize = -1
   Params = <
     item
       DataType = ftBlob
       Name = 'paramb'
       ParamType = ptInput
     end>
   SQLConnection = sql
   Left = 112
   Top = 168
 end

Так как же правильно это сделать ?


совсем чайник   (2007-02-22 11:19:00) [30]


> Хм, в [8] ответ уже дан, а они всё треплются...

добавляю
showmessage(inttostr(fproc.q1.params.count));
перед execsql
и в сообщении появляется "1"


Плохиш   (2007-02-22 01:03:00) [31]

Хм, в [8] ответ уже дан, а они всё треплются...


Johnmen   (2007-02-21 20:19:00) [32]

Если разговор про DBX, то никаких проблем с BLOB параметрами запроса там нет.


Val   (2007-02-21 15:47:00) [33]

вынеси работу с блобом тогда в отдельный от основного, дочерний датасет.запросы к нему будут бегать тогда только при необходимости получения/изменения блоба. нагрузку, соответственно, уменьшишь.


совсем чайник   (2007-02-21 15:08:00) [34]

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1171970900&n=18
я вот как раз с этим пытался бороться (


Reindeer Moss Eater   (2007-02-21 15:02:00) [35]

TClientDataSet.Append;
И вперед.

Только там пара граблей все равно припасена.


совсем чайник   (2007-02-21 14:59:00) [36]

т.е. сначала надо вставить запись без Blob-а, затем в датасете select-ом выбрать эту запись и уже в клиентдатасете вставлять в эту запись blob-поле ? так получается ?... жаль, тогда придется отказаться от блоба, лишние запросы к базе  только ухудшат работу (


Reindeer Moss Eater   (2007-02-21 14:49:00) [37]

Похоже блобы через dbExpress можно вставить только через редактируемый датасет. То есть через клиентдатасет прикрученный к датасету с селектом.


совсем чайник   (2007-02-21 14:46:00) [38]

Взято с mysql.ru:
http://www.mysql.ru/docs/man/INSERT.html
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
       [INTO] tbl_name [(col_name,...)]
       VALUES (expression,...),(...),...
или INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
       [INTO] tbl_name [(col_name,...)]
       SELECT ...
или INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
       [INTO] tbl_name
       SET col_name=expression, col_name=expression, ...


Val   (2007-02-21 14:34:00) [39]

приведи синтаксис insert для MySQL.


совсем чайник   (2007-02-21 14:27:00) [40]

так где ошибка- то в синтаксисе вы можете сказать ?
где в этом запросе
"insert into Jurup set Term_id=1399 , Qps='',Rxp='',Gcuber='',Txp='',Date_up='21.02.2007',Comment='
bock',Nes='',type=0,time=0,sepcimage= :paramblob"

ошибка синтаксиса и каким образом её поправить ?


Страницы:   1 2 3

Наверх

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