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

Вниз

BLOB и параметрический запрос   Найти похожие ветки 

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

Здравствуйте, использую 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" т.е. просто строчка...
Скажите пожалуйста почему так ? и как это исправить ?


 
Reindeer Moss Eater ©   (2007-02-21 13:36) [1]

fproc.q1.SQL.Text:=fproc.q1.SQL.Text+",sepcimage= "":paramblob""";

А нам предлагается угадать, что там у тебя написано в fproc.q1.SQL.Text.
Да?


 
Val ©   (2007-02-21 13:36) [2]

потому что в кавычках. убрать, соответственно.


 
совсем чайник   (2007-02-21 13:42) [3]


> А нам предлагается угадать, что там у тебя написано в fproc.
> q1.SQL.Text.
> Да?

Заполняются остальные поля таблицы, запрос проходит корректно, все заполняется хорошо, кроме 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;


при выполнении запроса получаю ошибку:

Project Linkterm.exe raised exception class EDatabaseError with message "Database Server Error: Failed to query
the server.(Error "1064"; Reason "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 ":paramblob" at line 3")".


 
Reindeer Moss Eater ©   (2007-02-21 13:50) [4]

И чего же тогда тебе не ясно?

You have an error in your SQL syntax

И даже указано где именно


 
Reindeer Moss Eater ©   (2007-02-21 13:51) [5]

fproc.q1.SQL.Text:=fproc.q1.SQL.Text+",sepcimage= :paramblob";
ShowMessage("пасматри, какую фигню ты написал"#13#10 + fproc.q1.SQL.Text);


 
Val ©   (2007-02-21 13:55) [6]

кстати - нужны ли эти строки:
p:=tparam.Create(nil);
p.Name:="paramblob";
fproc.q1.Params.AddParam(p);

?
обычно, при объявлении параметра в тексте запроса, он создается автоматически, при разборе...


 
Reindeer Moss Eater ©   (2007-02-21 13:58) [7]

А нужны ли строки, добавляющие к готовому в дизайне тексту sql строковый литерал?
Мысль конечно зело мудрая.
Особенно если код добавления выполнится несколько раз.


 
Johnmen ©   (2007-02-21 14:06) [8]


> Val ©   (21.02.07 13:55) [6]

Да, у него походу два параметра получается, с одинаковыми именами :)


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

В Disign-time параметров нет.
переделал код, вот запрос перед
fproc.q1.ExecSQL(true);

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

вот ошибка:

Project Linkterm.exe raised exception class EDatabaseError with message "Database Server Error: Failed to query
the server.(Error "1064"; Reason "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 ":paramblob" at line 1")".


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

для доказательства вот полный текст:

 object q1: TSQLQuery
   MaxBlobSize = -1
   Params = <>
   SQLConnection = sqlcon
   Left = 128
   Top = 48
 end

вот текст процедуры:

function newup (rra:rzap_up):integer;
var Stream: tstream;
   p:tparam;
   sq:string;
begin
strex:=strex+"  "+"newup";
 fproc.q1.Active:=false;
 fproc.q1.SQL.Clear;
 sq:="insert into Jurup set Term_id="+rra.id_term+" , Qps="""+rra.Qps+""",Rxp="""+rra.Rxp+""",Gcuber="""+rra.Gcuber+""",Txp="""+rra.Txp+""",Date_up="""+datetostr(rra.date)+""",Comment="""+rra.coment+""",Nes="""+rra.nes+""",type="+inttostr(rra.auto);
if not(rra.time=null) then
 sq:=sq+",time="+inttostr(rra.time);
if rra.image<>"" then
 begin
   sq:=sq+",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;
if rra.author<>"" then
 sq:=sq+",author="""+rra.author+"""";
try
 fproc.q1.SQL.Text:=sq;
//  showmessage(fproc.q1.SQL.Text);
 fproc.q1.ExecSQL(true);
 result:=0;
except
 result:=1;
   raise;
end;
end;


вот содержание типа:

rzap_up =record
 id:string;
 id_term:string;
 date:tdate;
 Qps:string;
 Rxp:string;
 Gcuber:string;
 Txp:string;
 coment:string;
 nes:string;
 auto:integer;
 time:integer;
 author:string;
 ebno:string;
 attn:string;
 attngcu:string;
 image:string;
end;


Ошибка, которую я описал на пост выше (


 
Reindeer Moss Eater ©   (2007-02-21 14:15) [11]

insert into Jurup set Term_id=1399

Кури учебник по SQL и не парь людям мозги.


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


> insert into Jurup set Term_id=1399
>
> Кури учебник по SQL и не парь людям мозги.
>

А чем вам не понравилось ?
уберем блоб из запроса и все работает:
insert into Jurup set Term_id=1399 , Qps="",Rxp="",Gcuber="",Txp="",Date_up="21.02.2007",Comment=" block",Nes="",type=0,time=0

все без проблем выполняется


 
Reindeer Moss Eater ©   (2007-02-21 14:26) [13]

В чем проблема тебе уже написали.
У тебя ошибка в синтаксисе.

Что делать тоже сказали
check the manual that corresponds to your
MySQL server version for the right syntax to use near ":paramblob" at line 1")".


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

так где ошибка- то в синтаксисе вы можете сказать ?
где в этом запросе
"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"

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


 
Val ©   (2007-02-21 14:34) [15]

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


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

Взято с 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, ...


 
Reindeer Moss Eater ©   (2007-02-21 14:49) [17]

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


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

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


 
Reindeer Moss Eater ©   (2007-02-21 15:02) [19]

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

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


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

http://delphimaster.net/view/2-1171970900/
я вот как раз с этим пытался бороться (


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

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


 
Johnmen ©   (2007-02-21 20:19) [22]

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


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

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


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


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

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


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

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

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

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


 
Johnmen ©   (2007-02-22 11:54) [26]

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:56) [27]

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) [28]

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


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

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


 
Desdechado ©   (2007-02-22 12:38) [30]

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

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


 
Reindeer Moss Eater ©   (2007-02-22 12:40) [31]

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


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

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

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".


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

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

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:48) [34]

Вобщем перепутал пока постил, но думаю смысл понятен:
при использовании обоих вариантов синтаксиса insert с любым типом параметра ошибка одна и та же


 
Reindeer Moss Eater ©   (2007-02-22 12:50) [35]

Про любой тип не надо. Любой как раз работал всегда.


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

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

Аабсолютно таже реакция (


 
Val ©   (2007-02-22 13:17) [37]

твоя версия mysql вообще, о параметрах знает?


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

проверял на:
4.1.16-max
5.0.23


 
Val ©   (2007-02-22 13:27) [39]

мне не говорят его версии ничего. что говорит его дока по поводу параметров?


 
совсем чайник   (2007-02-22 13:36) [40]

Знать бы где это искать в документации.
Если у вас работают запросы с параметрами, не могли бы вы мне сказать на какой версии и, если есть возможность, дать дистрибутив вашей версии ?



Страницы: 1 2 вся ветка

Текущий архив: 2007.05.13;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.039 c
6-1163088101
Суслик
2006-11-09 19:01
2007.05.13
Создание HTTP сервара на дельфи


2-1177346544
Kolan
2007-04-23 20:42
2007.05.13
Можно ли редактировать ячейки TListView?


15-1175808226
ampo
2007-04-06 01:23
2007.05.13
Небольшая коллекция мануалов


2-1176872724
Konus
2007-04-18 09:05
2007.05.13
работа с copy(s,1,2), Delete(s,1,2) и Pos( ; ,s)


2-1177321428
>>DEATH<<
2007-04-23 13:43
2007.05.13
вытаскивание ссылок