Adoquery ile blob resmi gösteremiyorum

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
MGd.
Üye
Mesajlar: 40
Kayıt: 08 Nis 2006 05:47
Konum: Aydın

Adoquery ile blob resmi gösteremiyorum

Mesaj gönderen MGd. » 20 Ara 2018 07:29

Merhaba.
Oracle üzerinden adoquery ile tabloadaki blob resim alanı sorgulamak istediğimde "veri türü uyumsuz" şeklinde uyarı alıyorum.

Blob alandaki resmi göstermek için birçok kodu inceledim fakat;
kesinlikle adoquery kullanarak bu işi yapmam lazım.

Sorgumuz
select resim from demohasta where id=2

resim sütunu blob alan.
demohasta içindeki bu alanı nasıl image1 içinde gösterebilirim?
İyi çalışmalar.
Mgdizayn.

denizfatihi
Üye
Mesajlar: 227
Kayıt: 16 Şub 2004 06:12
Konum: istanbul

Re: Adoquery ile blob resmi gösteremiyorum

Mesaj gönderen denizfatihi » 21 Ara 2018 07:57

Merhaba,

Ben aşağıdaki gibi yapıyorum, yalnız bazı arkadaşlarımız database eklenmesine karşı çıkıyor, tercih size kalmış.

Eklemek için

Kod: Tümünü seç

var
s:string;
begin
openDialog1.Title:='Resim Seç';
OpenDialog1.Filter:='Jpg Dosyaları|*.jpg';
if OpenDialog1.Execute Then
begin
S:=OpenDialog1.FileName;
 DataModule2.Tb_Personel.Edit;
 if s <> '' then
 begin
(DataModule2.Tb_Personel.fieldbyName('RESIM') as TblobField).loadfromFile(s);
end;
DataModule2.Tb_Personel.Post();
//end;
//begin
gecikme(500);

DataModule2.Tb_Personel.Requery();

end;
end;
okumak için

Kod: Tümünü seç

var
  JpegImage: TJPEGImage;
  BlobStream: TStream;
begin
   if (not Pro_Personel.FieldByName('RESIM').IsNull) then
//if (not Pro_Personel.FindField('RESIM').IsNull) then
    begin
      BlobStream := Pro_Personel.CreateBlobStream(Pro_Personel.FieldByName('RESIM'),bmRead);
     // BlobStream := Pro_Personel.CreateBlobStream(Pro_Personel.FindField('RESIM'),bmRead);
      JpegImage := TJPEGImage.Create;
      try
        JpegImage.LoadFromStream(BlobStream);
        Form1.Image1.Picture.Assign(JpegImage);
        Form1.Image1.Visible := True;
      finally
        JpegImage.Free;
        BlobStream.Free;
      end;
    end
  else
  Form1.Image1.Visible := False;

Kullanıcı avatarı
MGd.
Üye
Mesajlar: 40
Kayıt: 08 Nis 2006 05:47
Konum: Aydın

Re: Adoquery ile blob resmi gösteremiyorum

Mesaj gönderen MGd. » 21 Ara 2018 10:36

Teşekkür ederim hocam.
İyi çalışmalar.
Mgdizayn.

Kullanıcı avatarı
MGd.
Üye
Mesajlar: 40
Kayıt: 08 Nis 2006 05:47
Konum: Aydın

Re: Adoquery ile blob resmi gösteremiyorum

Mesaj gönderen MGd. » 21 Ara 2018 12:24

Üstadlarım, bu konu hakkında birşey daha sormak istiyorum.
Oracle üzerinde Adoquery ile tabloyu grid içine aktardığımda blob alanın olması nedeniyle 'veri türü desteklenmiyor' uyarısı almaktayım.
Grid içine bilgi getirmiyor. Sorguda blob alanı çıkarıp sütun isimlerini yazdığımda sorun olmuyor. Blob alanı gride getirmede sorun yaşıyorum.
Birçok konuyu inceledim. MSSQL de bununla ilgili sorun yaşanmıyor.

DBGrid yüzünden mi yoksa oracle db olması nedeniyle mi çözüme ulaşamadım.
Bu konuda bilginize ihtiyacım var.
Saygılarımla.
Mgdizayn.

Kullanıcı avatarı
Commandx
Üye
Mesajlar: 136
Kayıt: 01 Oca 2008 05:34

Re: Adoquery ile blob resmi gösteremiyorum

Mesaj gönderen Commandx » 23 Ara 2018 01:04

Arkadaşlar, Veritabanına doğrudan jpg eklenebiliyormu.
Yani bildiğim kadarıyla, Bmp olması gerekiyor, Ben de bunca denemelerime rağmen jpg resmi BLOB alanına kaydedemedim, hep bmp yükledim jpg yi bmp ye çevirerek yapmak zorunda kaldım.
Var mi öyle bir şey?
Bir de master tablomdaki bir adsoyad adres telefon gibi sütunlar bulunuyor, Detay tablomda da aynı şekilde bu sütunlardan bulunmaktadır.
Acaba Masterdeki diyelim telefon no'su değişen bir personelin daha önce Detay tabloya da kaydedilmiş bulunduğu için Masterdeki telefon numarasını güncellediğimizde de Detay alanında da güncellenmesi mümkün müdür. Sanırım Foreign key ler ile yapılıyor.
Bir iki denemede Masterdeki pkey ile Detaydaki id i bağlamıştım ikinci foreign keyi telno sütunundan alıp detaydaki telno sütununa foreign key tipinde bağlayınca hep hata verdi, illa ki foreign key alanı primary key e mi bağlanmak zorunda?
Bazen işin içinden çıkamıyorum.
http://www.delphibasics.co.uk/RTL.asp?Name=DaysBetween
Zamane tickcount'u
except
ON E: Exception do
Begin
Application.MessageBox(Pchar('Can sıkıntısı '+#13+E.Message),'Hata',MBOKk+MB_ICONWARNING);
Abort;
End;
end;

Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3037
Kayıt: 17 Nis 2006 07:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Adoquery ile blob resmi gösteremiyorum

Mesaj gönderen sabanakman » 24 Ara 2018 10:17

jpg ile bmp nin blob alana yazma ve okuma konusunda hiç bir farkı yoktur. Sonuçta ikili (binary) veri işliyorsunuz. En fazla jpg formatını gösterememiş olabilirsiniz belki onu da uses satırına jpeg ekleyerek çözebilirsiniz.

Master/Detail ilişkili tablolarda veriler hem ana (master) hem de alt (detail) tabloya yazılmaz. Bu tasarım hatasıdır. Ana tabloda temel alanlar bulunur detay tablolarda ise buradaki kayıtlara ilave bilgiler tanımlanır. Detaydan kayıt bir kere değiştirilir ve ana tablo ilişkilendirme yoluyla otomatik olarak değişmiş olur.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .

Kullanıcı avatarı
Commandx
Üye
Mesajlar: 136
Kayıt: 01 Oca 2008 05:34

Re: Adoquery ile blob resmi gösteremiyorum

Mesaj gönderen Commandx » 24 Ara 2018 03:40

Çözüldü ...
:bravo: Eski DBİMAGE nesnesi JPG yi desteklemiyor... Problem buymuş
JVDBIMAGE nesnesi eklenince Sorun olmadan kaydedip Silip Editleyebildim
Sürekli eski versiyon DBimage ve dataset navigator Kullandığımdan dolayı JPEG veritabanına desteklemiyormuş..
Sorun , Eski versiyon DataControls daki DBimage den kaynaklanıyor...
Kimse eski dbimage kullanmasın, Onun yerine JVDBIMAGE kullanın alttaki kodu kayıtta kullanın resim gerçekten orijinal jpg boyutunda veritabanına kaydoluyor.
Sıkıntı DBimage kayıt sırasında vt ye kaydolmadan jpg yi gösterme durumuna geçmesi, standart dbimagd için jpg tür uyumsuz olunca bu sefer kod satırı insert'e gelmeden sonlanıyor,.
Kaydetmek için kullandığım kod

Kod: Tümünü seç

var
s:string;
begin
OpenPictureDialog1.Title:='Resim Seç';
OpenPictureDialog1.Filter:='Jpg Dosyaları|*.jpg';
if OpenPictureDialog1.Execute Then
begin
S:=OpenPictureDialog1.FileName;
 uniquery1.Edit;
 if s <> '' then
 begin
(uniquery1.fieldbyName('resimalani') as TblobField).loadfromFile(s);
end;
uniquery1.Post();
end;
http://www.delphibasics.co.uk/RTL.asp?Name=DaysBetween
Zamane tickcount'u
except
ON E: Exception do
Begin
Application.MessageBox(Pchar('Can sıkıntısı '+#13+E.Message),'Hata',MBOKk+MB_ICONWARNING);
Abort;
End;
end;

Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3037
Kayıt: 17 Nis 2006 07:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Adoquery ile blob resmi gösteremiyorum

Mesaj gönderen sabanakman » 24 Ara 2018 07:11

sabanakman yazdı:
24 Ara 2018 10:17
...uses jpeg...
kullanmazsanız Unsupported stream format. hatası alırsınız ama bunu ekledikten sonra resimleri gösterme konusunda herhangi bir problem çıkmayacaktır. Bu ister dbimage olsun isterse de image türevi herhangi bir bileşen. JEDI bileşenleri de benzeri bir fonksiyonu otomatik olarak gerçekleştiriyor olabilir. Aynı şekilde yine standart delphi bileşenlerine yönelik olarak png formatlı dosyaları kullanabilmek için yine (eski sürüm olmayan delphilerde) uses'a pngimage eklemesi yapmak gerekmektedir.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .

Kullanıcı avatarı
Commandx
Üye
Mesajlar: 136
Kayıt: 01 Oca 2008 05:34

Re: Adoquery ile blob resmi gösteremiyorum

Mesaj gönderen Commandx » 24 Ara 2018 10:55

Hocam ben yıllardır bu sorunu jpg yi bmp ye çevirerek hallediyordum.
Baktım ki veritabanı bmp den dolayı şişiyor, Veritabanına resim kaydetmeyi birakarak jpgnin sadece dosya yolunu göstererek hallediyordum.
Uses de defalarca Jpeg unitinden tutun bir sürü resim komponenti kullandığım halde bunun nedenini anlayamamıştım
Firebird veritabanı için örnek bir proje oluşturup form uzerine standart bileşenler ve dbimage koyup
Aynı kodu buttona koyunca Invalid bitmap veya unsupported bitmap çok kısa bir error mesajı geliyordu tam hatırlamıyorum bu gibi gibi bir hata alıyordum, resim yüklemeyi bıraktım.
usesde Jpeg kullandım, kesinlikle kullandım.
Nasıl ki, Jedi'nin tjvdbimage nesnesini ekleyince
Ayni koda dokunmadan resmi başarıyla vt ye post etmeyi başardım, Hatta gözlerime inanamadım, belki yanlış görüyorum diye ayni resmi 4 defa yükleyince problemin, standart bileşenlerden kaynaklandığını anladım.
Bende olay böyle cereyan etti, müsait bir zamanda hiç kodlara dokunmadan jpg yi yuklemeyi başaramadığım proje ile yüklemeyi başardığım projeyi buraya yükleyeyim.
Bir sürü forumda veritabanına herkesin yakındığı jpg yükleyememe sorunu standart componentlerdir.
Ben hala delphi7 kullaniyorum, belki sizin kullandığınız tokyo berlin seattle versiyonlarinda bu hatalar giderilmiş ve yeni versiyonlarda Sorun giderilmiş olabilir.
Eski versiyonları seviyorum hızlı açılıyor.
Resim
İşte hata mesajı bu
En son Commandx tarafından 25 Ara 2018 07:26 tarihinde düzenlendi, toplamda 2 kere düzenlendi.
http://www.delphibasics.co.uk/RTL.asp?Name=DaysBetween
Zamane tickcount'u
except
ON E: Exception do
Begin
Application.MessageBox(Pchar('Can sıkıntısı '+#13+E.Message),'Hata',MBOKk+MB_ICONWARNING);
Abort;
End;
end;

Kullanıcı avatarı
Commandx
Üye
Mesajlar: 136
Kayıt: 01 Oca 2008 05:34

Re: Adoquery ile blob resmi gösteremiyorum

Mesaj gönderen Commandx » 24 Ara 2018 11:17

Çok önemli bir sorum var, yazdiğınızı okudum anlayamadım tekrar yazayım, Master tablomda primary key. adsoyad telno evadres gibi 4 sütunlu bir alanım var.
Detay tablomdada primary key, master_id, adsoyad, telno, evadres, doğtar, dogyer, vs gibi daha fazla detay isteyen masterden daha çok fazla alan var.
Detaydaki master_id=Masterdeki primarykey e bağlı, tamam buraya kadar herşey yolunda.
Demem şu ki;
Ben masterdeki evAdres verisini güncellediğim anda, bir personelimin, detay tablomdaki evadres sütununda bulunan alt alta sıralanmış olan yüzlerce evadres verisinin de güncellenmesini istiyorum.
Bunu nasıl yapabilirim, foreign keylerle yapiliyor mu?
Bildiğim kadarıyla Foreign key, dogrudan masterdeki alana bağlanabiliyor, masterdeki veri değiştiğinde detaydaki de değişmiş oluyor, detaydaki yüzlerce kayda girip her kayda ait evadresi verisini öncekiyle replace etmek mantıksız vede zor, ha bu döngü kullanarak da yapılabilir ama client server uygulamada sorun olur iş yavaşlar. Bir yanlışı devam ettirmeyeyim.
Fk ile denemelerimde fk alanlar hata verdi, sadece detayda fk olarak tanımladığım alanın masterdeki primary key alanina bağlayınca hata vermedi.
Kusura bakmayın böyle bir yapı kullanmak zorundayum.
kimine göre bu Hatalı görünebilir ama bana göre Hatalı değil böyle kullanmam gerek, Aksi halde istediğim raporu alamam.
Problem bu.
http://www.delphibasics.co.uk/RTL.asp?Name=DaysBetween
Zamane tickcount'u
except
ON E: Exception do
Begin
Application.MessageBox(Pchar('Can sıkıntısı '+#13+E.Message),'Hata',MBOKk+MB_ICONWARNING);
Abort;
End;
end;

yusuf simsek
Üye
Mesajlar: 307
Kayıt: 09 Mar 2004 11:18
Konum: Konya
İletişim:

Re: Adoquery ile blob resmi gösteremiyorum

Mesaj gönderen yusuf simsek » 25 Ara 2018 08:33

Foreinkey tarafı için yorum yapamayacağım ancak Veritabanında AfterPost trigger ile hızlı bir şekilde UPDATE yapabilirsiniz...

Bir nevi ForeinKey yapacağı işi siz yapmış olaacksınız
Bugün bir kez daha,
Hiç Birşey Bilmediğimi Öğrendim!!!

https://extrayazilim.com

Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3037
Kayıt: 17 Nis 2006 07:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Adoquery ile blob resmi gösteremiyorum

Mesaj gönderen sabanakman » 25 Ara 2018 09:40

Delphi 7 de iyiymiş :) . Eski sürüm için doğal jpeg desteği var mı emin değilim denemek lazım ama yoksa da yine bazı eklentiler gerekebilir (bulduğunuz jedi çözümü gibi) .

Eğer tarihe dayalı loglama söz konusu değilse (istediğiniz değişiklik buna işaret ediyor) veritabanında ana tabloya ait bilgilerin detay tablolarda da tutulması gerekmez. join sorgularla lazım olan ana kayda ait bilgileri getirebilirsiniz. Mesela..:

Kod: Tümünü seç

select TBL.*, MUS.ADRES from MUSTERI as MUS
right join (select MUS_ID, sum(Borc) as Borc, sum(Alacak) as Alacak from HAREKET group by MUS_ID) as TBL on TBL.MUS_ID=MUS.ID
gibi bir sorgu ile her müşterinin toplam ne kadar borcu ve alacağı var toplayarak gösterdiği gibi müşteriye ait ana tablodan adres bilgisini de sorguya ekleyecektir. Ana tabloda adresi değiştirmekle böyle bir yapıda tüm hareketlerde yeni adres değeri otomatik olarak ilişkisel sorgu nedeniyle gelecektir. Tablolar arası ilişkilerin ve sorguların biraz üzerinden geçmeniz gerekiyor gibi. Yoksa trigger lar veya kayıt ekranları v.s. gibi yerlere update sorguları eklemeniz gerekecek ama bununla sağlıklı çalışılır mı bilemem.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .

Cevapla