Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Сохранение BLOB в таблицу


Автор: tresda 14.12.2006, 07:21
Мир Вам великие Мастера!!

Такая проблема возникла при передачи при помощи SQL-запроса картинки загруженной в DBImage1 в таблицу.

Делаю всё при помощи следующего запроса:
Код

with form1.ADOQuery1 do
begin
SQL.add('insert into house (image) ');
sql.add(' values (:image)');
parameters.ParamValues['image'].LoadFromFile(OpenPictureDialog1.FileName);
execsql;

Однако при отработке запроса вылетает сообщение:
"Invalid variant operation"

Грабли в принципе понятно в чем, но как с ними справиться.

Заранее Большое спасибо за оказанную помощь, действительно ОЧЕНЬ нужно сделать

Автор: tresda 14.12.2006, 08:07
Пробую еще делать так, на первой кнопке загружаю картинку в DBImage, а во второй отправляю с DBIMAGE в таблицу house. 

Процедура первой кнопки: 
Код

Var B: TBitmap; 
begin 
if messagedlg('Добавить изображение?', mtwarning, [mbYes, mbNo],0)=mrNo 
then 
exit 
else 
dbimage1.Picture.LoadFromFile(OpenPictureDialog1.FileName); 
try 
if OpenPictureDialog1.Execute then 
begin 
B := TBitmap.Create; 
B.LoadFromFile(OpenPictureDialog1.FileName); 
DBImage1.Picture.Assign(B); 
end 
else 
exit; 
finally 
B.Free; 

Процедура второй кнопки: 

Код

with form1.ADOQuery1 do 
begin 
sql.clear; 
SQL.add('insert into house (image) '); 
sql.add(' values (:image)'); 
parameters.ParamValues['image']:=B; 
execsql; 

Вываливает ошибка: 
'Variant' and 'TBitmap' 

Однако здесь он от меня ждёт опять Variant, а я ему TBitmap даю. 

Блин что делать? У кого может другие вариант есть??? ГОРЮ!!! 

Автор: Alexeis 14.12.2006, 10:14
Может сделать приведение типов Variant(B); ?

Автор: Mephisto 22.12.2006, 16:50
Код
procedure TForm1.SavePicture(ID : integer);
var
  AStream : TMemoryStream;
begin
  AStream := TMemoryStream.Create;
  try
    AStream.LoadFromFile(OpenPictureDialog1.FileName);

    Query1.Close;
    Query1.SQL.Text := 'insert into table1 (ID, pctBLOB) values (:id, :pct)';

    Query1.Parameters.ParamByName('ID').Value := ID;
    Query1.Parameters.ParamByName('pct').LoadFromStream(AStream, ftBlob);

    Query1.ExecSQL;
  finally
    FreeAndNil(AStream);
  end;
end;

Автор: tresda 25.12.2006, 09:47
Спасибо большое интересная мысль, сейчас поробую сделать  smile

Автор: tresda 25.12.2006, 10:30
Ругается "СВОЛОШЬ" говорит ошибка в инструкции INSERT INTO  smile 
Вот полный код отработки кнопки, всё нормально работало до тех пор пока параметр image не добавил

Код

var AStream : TMemoryStream;
begin
AStream := TMemoryStream.Create;
AStream.LoadFromFile(sOpenPictureDialog1.FileName);
with form1.ADOQuery1 do
begin
if sEdit1.Text='' then
begin
messagedlg('Вы не ввели номер дома!!!'+#13#10+'Это поле обязательно для ввода!!!', mtwarning,[mbOk],0);
exit
end
else
begin
SQL.Clear;
SQL.add('insert into house (num_home, address, raion, korpus, index_home, count_etazh, type_home, count_kv, count_podezd, count_sobstv, count_propis, lift, otoplenie, Ploshad_zd, num_ZHEU, date_postr, date_kap_rem, date_next_rem, ksk, notik, image) ');
sql.add('  values (:num_home, :address, :raion, :korpus, :index_home, :count_etazh, :type_home, :count_kv, :count_podezd, :count_sobstv, :count_propis, :lift, :otoplenie, :Ploshad_zd, :num_ZHEU, :date_postr, :date_kap_rem, :date_next_rem, :ksk, :notik, :image)');

Parameters.ParamValues['num_home']:=sEdit1.text;
Parameters.ParamValues['address']:=sEdit5.text;
Parameters.ParamValues['raion']:=sEdit2.text;
Parameters.ParamValues['korpus']:=sEdit3.text;
Parameters.ParamValues['index_home']:=sMaskEdit4.text;
Parameters.ParamValues['count_etazh']:=sEdit8.text;
Parameters.ParamValues['type_home']:=sComboBox1.text;
Parameters.ParamValues['count_kv']:=sEdit10.text;
Parameters.ParamValues['count_podezd']:=sEdit9.text;
Parameters.ParamValues['count_sobstv']:=sEdit11.text;
Parameters.ParamValues['count_propis']:=sEdit12.text;
Parameters.ParamValues['lift']:=sComboBox3.text;
Parameters.ParamValues['otoplenie']:=sComboBox2.text;
Parameters.ParamValues['Ploshad_zd']:=sEdit6.text;
Parameters.ParamValues['num_ZHEU']:=sEdit7.text;
Parameters.ParamValues['date_postr']:=sMaskEdit1.text;
Parameters.ParamValues['date_kap_rem']:=sMaskEdit2.text;
Parameters.ParamValues['date_next_rem']:=sMaskEdit3.text;
Parameters.ParamValues['ksk']:=sComboBox4.text;
Parameters.ParamValues['notik']:=sEdit13.text;
Parameters.ParamByName('image').LoadFromStream(AStream, ftBlob);


end;
//memo1.Lines.Add(form1.ADOQuery1.SQL.Text);
try
execsql;
sql.clear;
SQL.add('select * from House order by num_home');
open;
messagedlg('Данные успешно добавлены!!!',mtinformation,[mbOK],0)
except
messagedlg('Неизвестная ошибка!!!'+#13#10+'Проверьте правильность введенных значений'+#13#10+'Возможно введены: повторный номер дома, неверные даты', mterror,[mbOk],0);
sql.clear;
SQL.add('select * from House order by num_home');
open;
exit
end;
FreeAndNil(AStream);
end;





А вот сам запрос который формируется, я его специально перед отработкой в Memo слил, чтобы глянуть  smile :


Код

insert into house (num_home, address, raion, korpus, index_home, count_etazh, type_home, count_kv, count_podezd, count_sobstv, count_propis, lift, otoplenie, Ploshad_zd, num_ZHEU, date_postr, date_kap_rem, date_next_rem, ksk, notik, image) 
  values(:num_home, :address, :raion, :korpus, :index_home, :count_etazh, :type_home, :count_kv, :count_podezd, :count_sobstv, :count_propis, 
:lift, :otoplenie, :Ploshad_zd, :num_ZHEU, :date_postr, :date_kap_rem, :date_next_rem, :ksk, :notik, :image)
 


В ЧЕМ ДЕЛО НЕ ПОЙМУ?!?!?!?!   smile   smile  

ЛЮДИ ДОБРЫЕ ПОМОГИТЕ!!!! smile 

Автор: Mephisto 25.12.2006, 11:42
Я так понял ругается в строчке номер 44? 
А можешь именно текст ошибки написать?

Добавлено @ 11:46 
Код

Parameters.ParamValues['notik']:=sEdit13.text;
AStream.Seek(0, soFromBegining); //вставленная строчка.
Parameters.ParamByName('image').LoadFromStream(AStream, ftBlob);

Блин, может тогда так. Больше ничего не вижу..  smile

Добавлено @ 11:47 
Кстати, а что такое Parameters?  smile 

Автор: tresda 25.12.2006, 13:39
Вот эта ошибка
"Exception class EOleException with message 'Ошибка синтаксиса в инструкции INSERT INTO'. Process KSKPro.exe (3928)"

Автор: Mephisto 25.12.2006, 15:21
Попробуй упростить запрос оставив 2 поля. Ключ и BLOB. И попробуй...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)