ole nesnesi ve veri tabanı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ekin
Üye
Mesajlar: 65
Kayıt: 11 Nis 2006 11:22

ole nesnesi ve veri tabanı

Mesaj gönderen ekin »

merhaba

bir soru bankası programı yapmaya çalışıyorum. Ole nesnesine ait olan bilgileri veri tabanına nasıl aktarırım. Veri tabanındaki bilgiyi ole nesnesine nasıl aktarabilirim.

Soruların Word de hazırlanıp veri tabanında saklanmasını isityorum
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

tüm sorular word ile hazırlamanaz. Özellikle matemetik, fen ve kimya. sözel derlerden çoğrafya'da benzer şekilde.
Soruları hazırlamak için corel draw ve quarkexpress kullanılır. her soruyu ayrı bir dosya olarak kaydedip veri tabannına blob olarak atabilirsin.

aklıma gelen bu.
ekin
Üye
Mesajlar: 65
Kayıt: 11 Nis 2006 11:22

Mesaj gönderen ekin »

ole nesnesi ile soruları yazıp veritabanına atmam için ne gerekir
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

hiç denemedim ama yine blop olarak atabilirsin sanırım.
Kullanıcı avatarı
tuanna
Üye
Mesajlar: 582
Kayıt: 06 Ara 2004 05:01
Konum: Ankara
İletişim:

Mesaj gönderen tuanna »

evet böle bir yöntem izlersen...
hem veri tabanı şişer hemde...program yavaş çalışır...
Siz hayal edin...Biz yapalım TuannaSoft...
ekin
Üye
Mesajlar: 65
Kayıt: 11 Nis 2006 11:22

Mesaj gönderen ekin »

peki ole ile yapılan işlemleri word gibi, txt gibi kaydedebilirmiyim. Ozaman sadece kaydedilen dosyanın yolunu veri tabanına aktarırım. böylede soruya ulaşmış olurum diye düşünüyorum. Acaba ole ile yapılan işlemleri nasıl kaydedebilirim.

Dileyim ki;
soruları

c:\sorubank\sorular

altınakaydedeceğim

ole ile alınan sorunun adıda soru1 olsun.

ole içindeki soruyu soru1.doc olarak yukarıdaki klasöre kaydetmek istiyorum.

bu arada veri tabanına da c:\sorubank\sorular\soru1.doc blgisini kaydetmek istiyorum.

bu işlemi nasıl yapabilirim
Kullanıcı avatarı
tuanna
Üye
Mesajlar: 582
Kayıt: 06 Ara 2004 05:01
Konum: Ankara
İletişim:

Mesaj gönderen tuanna »

bu daha mantıklı ama bu da çözüm olmuyor soru bankası programları hazırlamak çok zor iş...
ama çözümsüz değil tabi...

bir de word fizik sorusu naısl yazacaklar...düşündünmü bunu...
bunları düşün önce...
Siz hayal edin...Biz yapalım TuannaSoft...
ekin
Üye
Mesajlar: 65
Kayıt: 11 Nis 2006 11:22

Mesaj gönderen ekin »

ole nesnesi ve özellikleri ile bilgiyi nereden bulabilirim.

Soru bankası hazrılarken ole nesnesinden başka bir çözüm yolu bulamıyorum.

Fizik, Kimya, Coğrafya, Matematik gibi dersler için kesinlikle çizime ve tarayıcıdan soruyu almam gerekiyor.

Bu nesne ile ilgili geniş bilgiyi nereden bulabilirim.

yardımlarınızı bekliyorum
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

Merhabalar,

OLENesnesi alan tipine sahip bir alana bildiğiniz gibi ses, görüntü resim vb. şeyleri ekleyebiliyorsunuz.

Örnek olması amacıyla aşağıda bir resmi OLE alanına nası koyacağınızı ve oradan nasıl okuyacağınızı göstereceğim.

yazma işlemi için:

Kod: Tümünü seç

TBlobField(Q.FieldByName('Picture')).LoadFromStream(MS);
okuma işlemi için

Kod: Tümünü seç

   MS := TMemoryStream.Create;
   TBlobField(CDS.FieldByName('Picture')).SaveToStream(MS);
   MS.Position := 0;
   Image13.Picture.Graphic.LoadFromStream(MS);
   MS.Free;
MS görüldüğü gibi memorystream'dır. MemorryStream'e avi, wav yükleyin herşeyi saklarsınız. Bir tabloda hep resim sakladınız diye başka bir tür saklayamazısınız diye bir kural yok.

Mesela 1. sorunun OLE kısmına normal bir TEXT eklersiniz. 2. sonunun OLE kısmına bir resim.

CDS.FieldByName('Picture') ile gösterilen fieldları bu şekilde kulanmayabilirsiniz. Sizin table'a yüklü olan fieldın adı ilede erişim sağlıyaiblirisniz.

bunun gibi;
TBlobField(CDSPictureField).SaveToStream(MS);

Ancak şunu söylemek isterim, basit soru bankası için elbette access kullanılabilir, hatta benim vaktiyle çalışan harikafilmler.com adlı siteme günde 1500-2000 ziyaretçi gelirdi, ki resimler hep DB idi bişi olmazdı. Ama büyük boyutlu çalışacaksanız derhal mysql, mssql yada alternatiflerini kullanın derim.

Bir başka alternatif ise resim vb. şeyleri dışarıda tutmaktır ama bu pek pratik olmaktan çıkmaktadır. Önce falanca kayıdı değiştir, sonra onun resmini ilgili alana koy, linki db'ye ekle vs. vs. ama hepsi bi yerde olursa hiç sorun çıkmaz. Ben ne DB'lr gördüm, özellikle soru bankası DB'leri gördüm mysql'de mükemmel çalışıyordu.

Siz şimdi access ile tecrübe edin, sonra vertabanını diğer büyük ölçekli DB'lere aktarırsınız.

Kolay gelsin..
ekin
Üye
Mesajlar: 65
Kayıt: 11 Nis 2006 11:22

Mesaj gönderen ekin »

yazma işlemi için:
Kod:
TBlobField(Q.FieldByName('Picture')).LoadFromStream(MS);


okuma işlemi için
Kod:
MS := TMemoryStream.Create;
TBlobField(CDS.FieldByName('Picture')).SaveToStream(MS);
MS.Position := 0;
Image13.Picture.Graphic.LoadFromStream(MS);
MS.Free;

öncelikle bu konuda çok acemi olduğumu söylemek isterim.

kullandığınız komutları anlayamadım.

Kod:
TBlobField(Q.FieldByName('Picture')).LoadFromStream(MS);

blob bir nesne mi acaba hangi sekmede yer alıyor. Q. nedir ms de nesne ise nerede yer alıyor.

biraz daha açıklarsanız çok çok sevineceğim.

küçük bir uygulama bulabileceğim bir yer varsa yada sizlerde varsa bana gönderirseniz çok sevinirim
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

MS göstermiş olduğun gibi bir MemoryStream'dir.
Q ise bir table yada sqlquery olabilir.

siz blob alana (OLEnesnesi alanına) nerde bir resim yada ses yada vb. bir şey atamak istiyorsanız orada bu işlemleri yapacaksınız.
ekin
Üye
Mesajlar: 65
Kayıt: 11 Nis 2006 11:22

Mesaj gönderen ekin »

memorystream bir nesne mi.

accessde soru tablosunda soru_test isminde bir ole tanımladım.

program içinde bunun içine ole nesnesini nasıl aktarırım. soru_test içindeki değeri ole nesnesine nasıl aktarırım.
ekin
Üye
Mesajlar: 65
Kayıt: 11 Nis 2006 11:22

Mesaj gönderen ekin »

ole(blob) nesnesi hangi sekmede yer alıyor. memorystream bir nesnemi acaba.

acemi olduğumu söylemiştim.
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

bu acemilik adamı kanser eder dikkat etmek lazım..

şimdi delphide iki türlü bileşen vardır. (component)
görsel (VCL) bunlara design time bileşenler denir.
birde run-time bileşenler.

TMemoryStream, TBlobField birer run-time bileşenlerdir.

Bunları kodların içinden kendin create edip kullanabilirsin. Form üstüne konulan bileşenler gibi değildir.

karmaşıkta olsa gösterdiğim örnekte TMemoryStream'ın kod içinden Create ile olşuturulduğunu görmüş olman lazım.

TBlobField kullanımı ise, create işlemi olmadan "ahanda bunun gibi olsun" demek gibi kullanıldı.

Delphi'deki bileşenler bir hiyararşi içinde inşa edilirler, bir bileşen bir çok bileşenden ibaret olabildiği gibi, tek başına bağımsız bir temel bir bileşende olabilir.

TFiled'dan türeyen bir çok field bileşeni vardır Integer, String vb. alanlar için filed bileşenleri vardır. Siz bunları görmezsiniz, TTABLE vb. şeyler bunları kendi ayarlar. TBlobFiled'da BLOB alanlar için kullanılan bir filed'dır.

Şimdi senin alanın adı RESIM olsun, ve sen biliyorsun ki bu alan bir BLOB filed. Ve normalde formun üstündeki TABLE1'i çift tıklarsan bir filed listesi gelir. ilk başta boş gelir ama mouse sağ düğmeye basar ve tüm fieldları ekle dersen, filedlar otomatik eklenir. Kodların içine baktığında bunları görürsün. ve artık RESIM alanınıa TABLE1RESIM değişken adıyla erişmen mümkün olur. Ama çalışma kipinde (run-time'da) sorgulama bileşenleri kullanmak bazen işimizi kolaylaştırdığı gibi, hafızanında kontrol altında tutulmasını sağlar.

Eğer kod içinden bir sorgu bileşeni oluşturur ve bu sorgu bileşenlerinin filedlarını da create edeyim vs. vs. dersen ömrün yetmez. bir alay kod yazarsın.

Verdiğim örnekteki gibi, işine lazım olan alana manuel erişmek daha pratik olmaktadır.

TQuery, TClientDataSet vb. sorgulama bileşenleri ile bu tür kullanımlar popülerdir.

şimdi şunu deneyelim. ADI, SOYADI ve TELEFONU alanları olan bir FIHRIST tablomuz var. buna erişelim bakalım.

Kod: Tümünü seç

var
   CDS : TClientDataSet;
begin
   CDS := TClientDataSet.Create(Self); //self yerine application da diyebilirsin.
   CDS.RemoteServer := DCOM;
   CDS.Provaydırnaym := 'dspCommand';
   CDS.CommandText := 'select * from FIHRIST where SOYADI = :A';
   CDS.Params.ParamByName('A').Value := Edit1.TextBox;
   CDS.Open;
   if Not CDS.isEmpty
      begin
         ShowMessage('bu adamın şeysi budur: ' + CDS['TELEFONU']);
         ShowMessage('bir başka gösterim ile: ' + CDS.FieldByName('TELEFONU').Value);
         ShowMessage('showing with bir bambaşka: ' + CDS.FieldByName('TELEFONU').AsString);
      end;
   CDS.Close;
   CDS.Free;
end;
şimdi bu minik örnekte senin için önemli olan isEmpty'den sonraki kısımlardır. Bir alana nasıl eriştiğimi gösterdim. iki farklı yöntem ile.

şimdi bu alanlar için ayrıca TFIELD bileşenleri oluşturmama gerek kalmadı. Ben kendim direk eriştim. Ayrıca TStringField gibi bir şeyde kullanmadım. Çünkü eriş esnasında TFIELD olarak gelen CDS['xxx'], CDS.FieldByName .. bize istediğimiz String değeri döndürebiliyordu.

Yani şuda doğru bir gösterimdir: TStringField(CDS.FieldByName('SOYADI')).Value

ama TFIELD zaten benim istediğim tipteki değeri döndürme yetisine sahip. Bir üst sınıfa binmenin bir alemi yok..

BLOB gibi özel alanlar için bir üst sınıf belirteciyle okuma ve yazma yapmak en doğru hareket olacaktır.

TBlobField(CDS.FieldByName('RESIM')) demekle şunu söylüyorum.
Abi bu RESIM alanı var ya, işte bu resim alanı senin bildiğin TFIELD değil, o aslında bir TBlobField'dır, aman gözünü seveyim ona göre muamele yap.

Eee kodu siz yazdığınıza göre delphiye bu kodu işletmek kalıyor, tabi RESIM alanı bir blob alan değilse hata verecektir. Ama siz eminsiniz bu bir BLOB alandır.

şimdi TFIELD ile LoadFromStream yada SaveToStream gibi fonksiyonlar yok. Bu fonksiyonlar TBlobField içinde var.

Kod: Tümünü seç

CDS.FieldByName('RESIM').LoadFormStream;
yazın ver derleme yaparsan sintaks error verecektir.

doğrusu TBlobField(Q.FieldByName('RESIM')).LoadFromStream(MS); şeklinde olmalıdır.

Peki yukarıda bu satırla neyi ima ediyoruz. RESIM alanındaki DATA'yı MS adındaki memory stream'a aktar diyoruz.

Böylelikle TMemoryStream sınıfındaki MS ile artık elimizde RESIM alanı içindeki bilgilere sahip olduk. Şimdi iş bu MS içindeki DATA'yı TIMAGE vb. bir yere koymaya geldi. Yada RESIM içindeki bilgilerin bir JPEG formatlı resim olduğunu biliyorsanız;

Kod: Tümünü seç

var
   CDS : TClientDataSet;
   JPG : TJpegImage;
   HZ  : TMemoryStream;
begin
   HZ := TMemoryStream.Create;
   JPG := TJpegImage.Create;
   CDS := TClientDataSet.Create(Self); //self yerine application da diyebilirsin.
   CDS.RemoteServer := DCOM;
   CDS.Provaydırnaym := 'dspCommand';
   CDS.CommandText := 'select ADI, SOYADI, TELEFONU, FOTOSU from FIHRIST where SOYADI = :A';
   CDS.Params.ParamByName('A').Value := Edit1.TextBox;
   CDS.Open;
   if Not CDS.isEmpty
      begin
         TBlobfield(CDS.fieldbyname('FOTOSU')).SaveToStream(HZ);
         JPG.LoadFromStream(HZ);
         .
         .
         .
      end;
   CDS.Close;
   CDS.Free;
   JPG.Free;
   HZ.Free;
end;
evet JPG nesnesine FOTOSU alanındaki datayı aktardık. Artık elimizde bir resim var. Bunu bir TIMAGE içine yada benzeri bir ortama aktararak görebiliriz.

Diğer kısımlarıda sen geliştir. Yeterince bilgi verdiğimi düşünüyorum. Az bir gayretle acemiliğini üstünden atıp, kanserojen madde niteliğinden kurtulacağına inanıyorum.

Kolay gelsin.

Sevgi ve saygılarımla....
haznedarli
Üye
Mesajlar: 122
Kayıt: 31 Tem 2010 06:38

Re: ole nesnesi ve veri tabanı

Mesaj gönderen haznedarli »

herkese kolay gelsin elimde bir db var wolvox a ait bu db degişiklik yapamıyorum kullandıgım programa resim ekleyince bir dosyaya falan yazmıyor ama db ye direk yazıyor bu alan blob muş
ama resimler sql manager 2008 de görüntülenemiyor resimler cıkmıyor .. asp ile bu resimleri nasıl sitede gösterebilirim yardımlarınız için şimdiden teşekkürler dosyanın dll diye bir yeri var orada bunlar yazıyor...


CREATE TABLE DOSYA (
BLKODU DOUBLE PRECISION NOT NULL,
BAGKODU VARCHAR(30) CHARACTER SET WIN1254 COLLATE WIN1254,
DOSYAADI VARCHAR(75) CHARACTER SET WIN1254 COLLATE PXW_TURK,
ACIKLAMA VARCHAR(100) CHARACTER SET WIN1254 COLLATE PXW_TURK,
FILEDATA BLOB,
OZELKODU VARCHAR(30) CHARACTER SET WIN1254 COLLATE PXW_TURK);


ALTER TABLE DOSYA ADD PRIMARY KEY (BLKODU);


CREATE INDEX DOSYA_BAGKODU ON DOSYA(BAGKODU);
Cevapla