Форум: "Базы";
Текущий архив: 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