ole nesnesi ve veri tabanı
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
ole nesnesi ve veri tabanı
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
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
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
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
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
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
- Murat DİCLE
- Kıdemli Üye
- Mesajlar: 702
- Kayıt: 19 Nis 2006 04:12
- Konum: İstanbul
- İletişim:
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:
okuma işlemi için
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..
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);
Kod: Tümünü seç
MS := TMemoryStream.Create;
TBlobField(CDS.FieldByName('Picture')).SaveToStream(MS);
MS.Position := 0;
Image13.Picture.Graphic.LoadFromStream(MS);
MS.Free;
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..
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
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
- Murat DİCLE
- Kıdemli Üye
- Mesajlar: 702
- Kayıt: 19 Nis 2006 04:12
- Konum: İstanbul
- İletişim:
- Murat DİCLE
- Kıdemli Üye
- Mesajlar: 702
- Kayıt: 19 Nis 2006 04:12
- Konum: İstanbul
- İletişim:
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.
ş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.
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;
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....
ş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 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;
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;
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....
-
- Üye
- Mesajlar: 122
- Kayıt: 31 Tem 2010 06:38
Re: ole nesnesi ve veri tabanı
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);
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);