Форум: "Базы";
Текущий архив: 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]Знать бы где это искать в документации.
Если у вас работают запросы с параметрами, не могли бы вы мне сказать на какой версии и, если есть возможность, дать дистрибутив вашей версии ?
← →
Reindeer Moss Eater © (2007-02-22 13:43) [41]начиная с версии 4.1 dbx не совсем дружит с мускулом. В частности нет поддержки новой аутентификации. надо либо убирать пароль, либо переводить юзера на старую модель.
Возможно что и работа с блобами там отъехала.
← →
совсем чайник (2007-02-22 13:46) [42]на 4-й стандартная библиотека работет вроде как нормально.
для 5-й версии использую dbx4mysql.dll тоже нареканий не было пока (
← →
Johnmen © (2007-02-22 13:52) [43]
> совсем чайник
ParamCheck какой?
← →
совсем чайник (2007-02-22 13:53) [44]пробовал с true и при этом создавал сам параметр в Disigntime, в runtime только задавала свойства этого параметра, пробовал с false, в этом случае создавал параметр и задавал его свойства в run-time
← →
совсем чайник (2007-02-22 13:55) [45]Попробовал с созданным параметром в disign-time и false И true в paramcheck, результат тот же, ошибка синтаксиса mysql
← →
Johnmen © (2007-02-22 13:57) [46]Пробуй [33] ParamCheck = True
← →
совсем чайник (2007-02-22 14:01) [47]object sql: TSQLConnection
ConnectionName = "MySQLConnection"
DriverName = "MySQL"
GetDriverFunc = "getSQLDriverMYSQL"
LibraryName = "dbxmys30.dll"
Params.Strings = (
"DriverName=MySQL"
"HostName=127.0.0.1"
"Database=test"
"User_Name=root"
"Password="
"BlobSize=-1"
"ErrorResourceFile="
"LocaleCode=0000"
"Compressed=False"
"Encrypted=False")
VendorLib = "libmysql.dll"
Left = 56
Top = 64
end
object q1: TSQLQuery
SchemaName = "root"
MaxBlobSize = -1
Params = <
item
DataType = ftUnknown
Name = "paramb"
ParamType = ptUnknown
end>
SQLConnection = sql
Left = 112
Top = 168
endsql.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 14:02) [48]Здесь в тексте не показалось конечно, так как paramcheck остался по умолчанию, т.е. true
← →
Desdechado © (2007-02-22 14:03) [49]> Попробовал с созданным параметром в disign-time и false И true в paramcheck
Ты явно не понимаешь смысла этого свойства. Оно указывает, будут ли параметры создаваться автоматически при изменении SQL.Text
← →
совсем чайник (2007-02-22 14:06) [50]Я понял, просто криво описал (
← →
Johnmen © (2007-02-22 14:16) [51]Пробуй - в дизайне прописать запрос/, определить параметр. В рантайме только ExecSQL.
И с какой стати ExecSQL(true)???????????? не понимаешь смысла...
← →
Reindeer Moss Eater © (2007-02-22 14:19) [52]Я пробовал вставлять блоб через параметры с квери настроенном в дизайне.
параметры патраметров настроены в дизайне. текст sql в рантайме не менялся. Не работает.
MySQL 4.0x
← →
совсем чайник (2007-02-22 14:37) [53]Простите ( виноват (( исправил, как же сразу не догадался ((
execsql(false) ((( еще раз извиняюсь (
и второй вопрос сразу
а выбрать оттуда картинку каким образом корректно ?
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2007.05.13;
Скачать: [xml.tar.bz2];
Память: 0.59 MB
Время: 0.047 c