Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.05.13;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.043 c
11-1153722586
StRaNNiK
2006-07-24 10:29
2007.05.13
Как связать TrayIcon c PopupMenu в KOL?


15-1176552575
Иксик
2007-04-14 16:09
2007.05.13
Посоветуйте платежные системы для web сайтов, которые принимают


2-1177482554
pathfinder
2007-04-25 10:29
2007.05.13
Перекрытие метода..


15-1176723476
Yaros-hoi
2007-04-16 15:37
2007.05.13
Фильтрация по дате


2-1176463675
iviom
2007-04-13 15:27
2007.05.13
TDateTimePicker





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский