![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
BLOB и параметрический запрос [D7, MySQL]
совсем чайник © (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"
ошибка синтаксиса и каким образом её поправить ?