![]() |
![]() |
![]() |
|||||||||||||||||||||||||||||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||||||||||||||||||||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
||||||||||||||||||||||||||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
||||||||||||||||||||||||
![]() |
![]() |
||||||||||||||||||||||||||||||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
||||||||||||||||||||||
Table'ın Active özelliğini False yapın ve Form'un OnCreate olayına aşağıdaki kodu ekleyin Session.AddPassword('şifre'); Table1.Active:=True;
Eğer grid’in MultiSelect özelliği True yapılmışsa ve grid’den rastgele iki veya daha fazla kayıt seçilmişse seçilen kayıtlara aşağıdaki kod yardımıyla ulaşabilirsiniz. procedure TForm1.BitBtn1Click(Sender: TObject);
Lokal bir veritabanı ile çalışırken (Paradox, dBase gibi) Table kullanın. Client/Server bir veritabanı (Oracle, Interbase, SQL Server, Sysbase gibi) ile çalışıyorsanız Query kullanın.
procedure TForm1.BitBtn1Click(Sender: TObject); {Bu ipucu Abdurrahman Sinanoğlu tarafından gönderilmiştir}
procedure TForm1.Button1Click(Sender: TObject); {Bu ipucu Abdurrahman Sinanoğlu tarafından gönderilmiştir}
Bir paradox dosyasına şifre koymak için :
uses kısmına DBTables ekleyin. Combobox1'e mevcut listeyi almak için : Session.GetDatabaseNames(Combobox1.Items);
Session.GetTableNames(Combobox1.Text, '', True, False, ListBox1.Items); Parametreler sırasıyla veritabanının adı, filtre (sadece lokal veritabanları için), tablo dosya uzantıları olacak mı?, sistem tabloları gösterilecek mi? (sadece SQL veritabanları) ve listenin getirileceği yer.
Table1.MoveBy(3);
En fazla 255 alan (field) olabilir.
BDE artık gelişitirilmiyor. Son versiyonu 5.2 ise Oracle 8.0.4'ten 8.1.6'ya kadar destekliyor. Oracle 9i için dbExpress kullanmalısınız. dbGO'nun diğer bir ismi ADO. Delphi 5 Enterprise ve Delphi 6 ve sonrasında Professional ve Enterprise sürümlerinde yer alıyor. Delphi 5 Professional'a da ayrıca kurulabiliyor. Diğer bir ismi de ADO Express.
dbExpress şu anda DB2, Interbase, MySQL, Oracle ve Informix ile
çalışabiliyor. Delphi 7 ile birlikte SQL Server 2000'de bu listeye dahil oldu.
Bazen programda bilgilerinizi geçici olarak saklama ihtiyacı duyarsınız. Memory Table'lar bu iş için biçilmiş kaftan. Şu an piyasadaki en iyi memory table bileşeni kbmMemTable ve bedava. Bileşeni sitesinden indirebilirsiniz : www.components4developers.com Paradox tek kullanıcılı programlarda pek fazla problem çıkarmazken, ağ ortamında eğer dikkatli kullanılmazsa tam bir başbelası. Ayrıca BDE'nin artık geliştirilmiyor olması ayrı bir dezavantaj. Paradox yerine çeşitli 3. parti veritabanları kullanabilirsiniz. Delphi veritabanı desteği yönünden çok geniş, ancak ben çok tutulan 2 bileşeni aşağıda belirttim. - dbIsam ( www.elevatesoft.com ): Çok kullanıcı desteği var, ODBC desteği var, SQL desteği var, teknik desteği çok iyi. dbIsam parayla satılıyor, sitesinden deneme sürümünü indirip deneyebilirsiniz. - Easy Table ( www.aidaim.com ) : SQL desteği var, hızlı. Easy Table da parayla satılıyor, sitesinden deneme sürümünü indirip deneyebilirsiniz. NOT : Bir de bedava bir çözüm olan TurboPower FlashFiler var. İyi bir veritabanı, bedava olması ve BDE gerektirmemesi de avantajları. Sitede 3. parti bileşenler kısmında, TurboPower yazısında detayları ve linki var.
- Paradox tablosuna yazdığınız veriler anında dosyaya kaydedilmez. Anında kayıt olmasını istiyorsanız BDE Administrator'dan Local Share özelliğini True yapın. (BDE Administrator - Configuration - System - INIT). - Eğer cachedUpdates çalışmıyorsanız, Tablonun CachedUpdates özelliği False'mu dikkat edin. - Bunların ikisi de işe yaramaz ise Table/Query bileşenini silip yeni bir bileşen koyup, onu ayarlayın.
Aşağıdaki kodla bu işi yapabilirsiniz. NO alanının değeri 100'den küçükse satır sarı, 100 ile 200 arası ise yeşil, 200 ile 300 arası ise kırmızı olur. procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var MyValue: integer; begin if gdSelected in State then Exit; MyValue := DBGrid1.DataSource.DataSet.FieldByName('NO').AsInteger; if MyValue <100 then DBGrid1.Canvas.Brush.Color := clYellow else if MyValue <200 then DBGrid1.Canvas.Brush.Color := clGreen else if MyValue <300 then DBGrid1.Canvas.Brush.Color := clRed; DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State); end;
SQL
Table unidirectional bir dataset'tir. Yani birden fazla kayıtı hafızadaki
buffer'da tutmaz. Bunlar da First ve Next metoduyla kayıtlar arasında
gezebilirsiniz. Raporlama gibi işlemler için oldukça kullanışlıdır.
Table : Table1.RecordCount; Query : SELECT COUNT(*) FROM TABLO_İSMİ
Paradox'ta silinen kayıtlar geri kurtarılamıyor. Silinen kayıtların üzerine boş
bilgiler yazılıp yeni bir kayıt için ayrılıyor. 1. Forma
bir TcheckBox bileşeni koyun ve visible'ını False yap. Verdiğim kodda TcheckBox'ın ismi :
Dbck
jpeg'i
kaydetme :
procedure TForm1.loadPic; var jpeg: TJPEGImage; Stream: TMemoryStream; BlobField: TBlobField; begin BlobField := table1.DataSet.FieldByName('Bild') as TBlobField; jpeg := TJPEGImage.Create; try if (Image1.Picture.Graphic is TJPegImage) then begin jpeg.Assign (ImageFoto.Picture.Bitmap); end; Stream := TMemoryStream.Create; try jpeg.SaveToStream (Stream); DataSourceForm.DataSet.Edit; BlobField.LoadFromStream (Stream); finally Stream.Free; end; finally jpeg.Free; end; end;
procedure TForm1.Table1AfterScroll(DataSet: TDataSet); var MS: TMemoryStream; J1: TJPEGImage; begin J1 := TJPEGImage.Create; MS := TMemoryStream.Create; try TBlobField(DataSet.Fieldbyname('myBlob')).SaveToStream(MS); MS.Seek(0,soFromBeginning); with J1 do begin PixelFormat := jf24Bit; Scale := jsFullSize; Grayscale := False; Performance := jpBestQuality; ProgressiveDisplay := True; ProgressiveEncoding := True; LoadFromStream(MS); end; if MS.Size >0 then Image1.Picture.Assign(J1) else Image1.Picture.Assign(nil); finally J1.Free; MS.Free; end; end;
I. Yol : Renkleri integer tipinde bir alana kaydedebilirsiniz. Veritabanına kaydetmek için : Table1.FieldByName('ColorField').AsInteger := Integer(AColor); Veritabanından okumak için : AColor := TColor( Table1.FieldByName('ColorField').AsInteger);II.Yol : StringToColor ve ColorToString döünüşümlerini yaparak string bir alana kaydedebilirsiniz.
Access Violation olmayan, henüz oluşturulmamış bir nesneye ulaşmak isterseniz
çıkar. Mesela 10 öğeli bir dizide 11. öğeye ulaşmaya çalışırsanız, bu
hata çıkar. 11. öğe yok çünki.
Alan isimlerini verirken, NO, NOT vb. ayrılmış kelimeleri (reserved words) kullanmamalısınız. Bu kelimelerin tamamını kullandığınız veritabanının dökümanlarından öğrenebilirsiniz.
Bu hiç uygun bir yol değil. Hele ki bu auto increment alanları key olarak
kullanıyorsanız, zaten AutoInc alanlara müdahele edemezsiniz.
1. Sorgulama, Sıralama ve gruplama için çok kullandığın alanları indeksle.
Mesela genelde kayıtlarını tarih'e göre süzüyorsan, Tarih alanını indeksle. 5. Eğer veritabanınız destekliyorsa mümkün olduğu kadar veritabanı bazlı çalışın, trigger ve stored procedure kullanın.
function GetBlobSize(Field: TBlobField): Longint; Kullanılışı : Edit1.Text := IntToStr(GetBlobSize(Notes));
var
Veritabanı olarak dBase kullanıyorsanız ve _qsql000.dbf , _qsql213.dbf bunlar gibi temp dosyalar oluşabilir. Eğer tablolara query'lerle ulaşıyorsan bu tip temp tabloların oluşması normaldır. Program normal şekilde sonlandırıldığında silinmeleri gerekir. Yoksa programı kapatırken o tip dosyaları aratıp sildirebilirsiniz.
index out of date hatası, tablodaki veri ile index arasında uyşmazlık olduğu zaman meydana çıkan bir hata. Bu durumu düzeltmek için indexi kaldırıp tekrar oluşturun. Bu hatanın oluşmasına sebep olan 8 neden tespit edilmiş. Aşağıdaki linkten detaylara bakabilirsiniz : http://bdn.borland.com/article/0,1410,15209,00.html
Bu mesajı genelde büyük veritabanlarından farklı
özellikteki sql ifadelerini database desktop gibi bir uygulamada çalıştırmak
istediğinizde karşınıza çıkar. Böyle bir durumla karşılaşmamak için
uygulamanızda kullandığınız database'in toolları ile denemek istediğiniz şeyleri
yapabilirsiniz (Sql Server-Query Analyzer, Oracle-Sql Plus veya 3rd parti
programlar)
http://www.borland.com/devsupport/bde/files/tutil50.zip dosyasını indirin. Bu Borland'ın paradox tablolarındaki problemleri düzeltmek için yayınladığı bir dll. http://www.borland.com/devsupport/bde/files/tutil32d.zip bu dosyayı da indirin. Bunda da hem dll'in nasıl kullanılacağını gösteren kaynak kod var, hem de exe dosya olarak direk çalışabilir hali var. Tablolarınızı kurtarıp, daha sonra bu dll ile programınıza index düzeltme seçeneği koyabilirsiniz. NOT : çalıştırmadan önce yedek almayı unutmayın.
Query nesnesinde sonuçlar salt okunur olarak döner (AdoQuery hariç!). Eğer SQL cümleciğiniz basit ise Query'nin RequestLive özelliğini True yaparak, Query'i yazma/okuma durumuna alabilirsiniz. Ancak karmaşık SQL cümlelerinde bu işe yaramayacaktır. Bunun için TUpdateSQL bileşenini kullanmalısınız. http://www.ibphoenix.com/ adresinden Main Downloads kısmına girin. ODBC kısmından IBPhoenix Open Source ODBC Driver'a tıklayın.
1. Query'de ExecuteOptions =[eoAsyncFetchNonBlocking]
yapın.
view'lar bir veya birden fazla tablodan verileri
çekmek için; bir SQL cümlesi ile oluşturulan sanal bir tablodur. Bu tablo veya
tablolara kayıt eklendikçe, ilgili view'da kayıtları görebilirsiniz. View'daki
bilgiler veritabanında depolanmaz, ilgili tablolardan alınır. Ne işe yarar: 3. Tabloyla birlikte bir takım bilgiler göstermek için kullanışlı olabilir. Mesela bazı alanları toplamı veya bu alanlardan en büyüğü, en küçüğünü göstermek gibi.
Eğer SQL cümlesini kod ile oluşturyorsanız, bir hata durumunda oluşan SQL cümleciğini görüp, hatayı tespit etmek isteyebilirsiniz. Bu durumda kodda SQL cümlesini ekledikten sora Open/ExecSQL komutunu vermeden şu satırı yazın. Bu size Query'nin içinde oluşan SQL cümlesini gösterir. ShowMessage(Query1.SQL.Text);
Bunun için kullandığınız table'da bir calculated alan oluşturun, mesela
SIRANO olsun. Daha sonra Table'ın OnCalcFields olayına
aşağıdaki kodu yazın:
Bunun için veritabanı ile birlikte gelen IB Console programını kullanabilirsiniz. Ancak bu pek kullanışlı değildir. Piyasada bu işi yapan birçok araç var. Bunlardan en iyileri : * IB Expert : www.ibexpert.com - Personal sürümü ücretsiz. * EMS Interbase Manager : www.ems-hitech.com Bu araçlar ile veritabanı, tablo, index oluşturma, kayıtları görme vs. gibi komple veritabanı yönetim işlemlerini yapabilirsiniz.
dBase'de bir kayıtı sildiğiniz zaman fiziksel olarak silinmez, dosya da kalır. Pack işlemi silinen ama hala dosyada duran kayıtları fiziksel olarak siler ve dosyanın boyutunu küçültür. Paradox'ta da kayıt silindiği zaman fiziksel olarak silinmez ancak sonraki yapılan kayıtlar, bu silinen kayıtların üzerine kaydedildiğinden paradox tablolarında, pack işlemi pek gerekli değildir. dBase'de pack işlemini, Borland'ın yayınladığı kodlarla yapabilirsiniz. Şu iki dosyayı indirin :
http://www.borland.com/devsupport/bde/delphi_controls/table_pack/tablpack.zip
* BDE Administrator'ü açın. Denetim Masası veya Delphi
linklerinden
Datamodule özel bir formdur ve görünmeyen (non visual) bileşenleri birden fazla formdan ortak kullanmak için tercih edilir. Bunlarda genelde veritabanı bileşenleridir. Mesela bir datamodüle koyduğunuz bir table bileşenini birçok formdan kullanabilirsiniz. Tabi illa veritabanı bileşeni olması gerekmiyor. Diğer görünmeyen bileşenleride datamodule'e koyabilirsiniz.
Elektirik kesintisi gibi durumlarda paradox tablosundaki verilerin kaybını önlemek için : Uses a BDE ekleyin ve her table veya query nin
afterpost olayına aşağıdaki kodu yaz. Bir daha elektrik kesilmesinden
etkilenmezsin ve index bozulmalarıda yaşamazsınız.
Mesela bir tabloda kayıtları baştan sonra tarıyorsanız, bu kodları yazmazsanız, geçerli kayıtın bilgileri bağlı DBEdit, DBGrid vs. de güncellenir. Bu hem görüntü açısından hoş olmuyor, hem de işlemi yavaşlatıyor. Bu kodları yazarsanız bağlı bileşenlerle irtibat kesiliyor ve bu olumsuzluklar olmuyor, tekrar bağlıyorsunuz.
Delphi'de Query'ler iki şekilde açılabilir : Open veya ExecSql. Peki ne zaman Open, ne zaman ExecSql kullanılır? Bu çalıştırdığınız SQL cümlesine bağlı. Eğer SQL cümlesi sonuçta size kayıt(lar) döndürüyorsa Open kullanmalısınız. Mesela SQL cümleniz "SELECT *..." gibi ise. Eğer SQL cümleniz hiçibr kayıt döndürmüyorsa, ExecSQL kullanmalısınız. Mesela UPDATE, INSERT, DELETE gibi bir sql cümlesi yazmışsanız.
TDatabase nesnesi veya benzer işlevi gören (mesela TAdoConnection) bir bileşeni açtığınız zaman karşınıza Login ekranı gelir ve sizden kullanıcı ismi ile şifre girmeniz istenir. Bu ekranın çıkmaması için LoginPrompt özelliğini False yapın.
Delphi'de temel kural olarak, DB bileşenlere (DBEdit, DBLookupComboBox vs) atama yapmayın, ilgili field'a atama yapın. DBLokupComboBox'ın içeriğini temizlemek için KeyValue'sinin değerini null yapın. Örneğin PERSONEL tablosunda BOLUM_NO alanına karşılık BOLUM_ADINI getiriyorsanız : PERSONELBOLUM_NO.Clear;
Bazı kayıtlardan çift ise problem çıkartabilir. Bu tip kayıtları SQL ile çok kolay bir şekilde tespit edebilirsiniz. Mesela PERSONEL tablosunda, birden fazla aynı isme sahip kayıtları dökmek için : SELECT AD_SOYAD, COUNT(*) |
![]() |
||||||||||||||||||||||||||||||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||||||||||||||||||||||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |