Otomatik Veritabanı Oluşturma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
bnyamin
Üye
Mesajlar: 44
Kayıt: 01 Mar 2019 12:55

Otomatik Veritabanı Oluşturma

Mesaj gönderen bnyamin »

Merhaba arkadaşlar delphi 7 de bir program yazdım firebird veritabanı kullanıyorum.Daha önce görmüş olduğum bir programdan esinlenerek kullanıcı giriş ekranına girişden ziyade birde veritabanı oluşturma ve bağlanma bölümü koydum ama sadece koymakla yetinebildim çümkü çok aramama rağmen bana yardımcı olacak kodu bulamadım.Kısacası sizden istediğim giriş ekranının veri tabanı bölümüne geçtiğimde edit nesnesine girilen benim istediğim bir isimle butona bastığımda veritabanı otomatik oluşturulsun ve bağlantısı yapılsın. bunu nasıl yapabilirim buna benzer örnek kodlarınız ya da projeniz varsa benimle paylaşırsanız çok mutlu olurum. Yardımlarınız için şimdiden teşekkür ediyorum.
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Otomatik Veritabanı Oluşturma

Mesaj gönderen ertank »

Merhaba,

Öncelikle mümkün ise Delphi 10.3.3 geçişi yapın. Yıllık 5000 USD veya altında kazancınız var ise ücretsiz lisans alıp kullanabiliyorsunuz.

Sorunuzu cevaplayabilmek için kullandığınız veritabanı erişim bileşenlerini bildirmeniz mümkün müdür?
bnyamin
Üye
Mesajlar: 44
Kayıt: 01 Mar 2019 12:55

Re: Otomatik Veritabanı Oluşturma

Mesaj gönderen bnyamin »

Cevabınız için teşekkür ederim delphi 7 kullanmamın sebebi raporlama aracının bulunması ama bilgisayarımda 10.3 rio da yüklü veritabanına adoconnection ve adoquery ile erişiyorum tavsiyeniz doğrultusunda başka erişim araçlarınıda kullanabilirim.
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Otomatik Veritabanı Oluşturma

Mesaj gönderen ertank »

ODBC üzerinden FirebirdSQL veritabanına erişmek yerine bu veritabanı için geliştirilmiş FIBPlus bileşenlerini kullanabilirsiniz.

Veritabanına özel tasarlanmış bileşen kullanmanın iki avantajı olacaktır. İlk avantaj performans, ikinci avantaj ise veritabanına özel EVENTS gibi özellikleri kullanmanız müknün olacaktır.

Ancak FIBPlus bileşenleri artık geliştirilmiyor ve FirebirdSQL 3.0 desteği bulunmamakta (FirebirdSQL 3.0 ile gelen BOOLEAN veri türü ve bazı diğer yeni özellikler desteklenmiyor) bu anlamda mümkün ise UniDAC, IBDAC veya FireDAC gibi geliştirilmesi devam eden bir bileşen seti tercih edebilirsiniz.

Ancak Delphi 7 için sadece FIBPlus, UniDAC, IBDAC uyumlu olacaktır. FireDAC daha yeni sürümler ile desteği gelen bir bileşen seti.
FIBPlus: https://github.com/madorin/fibplus
UniDAC: https://www.devart.com/dac.html
IBDAC: https://www.devart.com/ibdac/

FIBPlus ile kod kullanarak veritabanı oluşturmak için aşağıdaki gibi bir yöntem izleyebilirsiniz:

Kod: Tümünü seç

  // Normalde aşağıdaki satırı tasarım zamanında yapabilirsiniz. Kod olarak eksik olmaması adına ekledim
  pFIBDatabase1.DefaultTransaction := pFIBTransaction1;
  
  // Sadece uygulama ilk çaılışında bir defa ayarlanması yeterli
  // 64Bit işletim sisteminde 32Bit uygulama 32Bit client DLL kullanmalıdır.
  pFIBDatabase1.LibraryName := 'C:\Program Files\Firebird\Firebird_2_5\WOW64\fbclient.dll';

  // Veritabanını kod kullanarak oluşturmak için gerekli ayarlar
  pFIBDatabase1.DBParams.Clear();
  pFIBDatabase1.DBParams.Add('USER ''SYSDBA'' PASSWORD ''masterkey'''); // kullanıcı adı ve şifre burada veriliyor.
  pFIBDatabase1.DBParams.Add('PAGE_SIZE = 16384');
  pFIBDatabase1.DBParams.Add('DEFAULT CHARACTER SET WIN1254');  // Türkçe karakter desteği için WIN1254 kullanılmalı
  pFIBDatabase1.DBName := 'localhost:C:\DB\TEST.fdb';  // ilgili sunucu (localhost) ve oluşturulacak veritabanı adı tam yol olarak belirtilmeli
  pFIBDatabase1.SQLDialect := 3;

  pFIBDatabase1.CreateDatabase(); // Burada artık veritabanı oluşturuluyor
UniDAC ile kod kullanarak veritabanı oluşturmak için aşağıdaki gibi bir yöntem izleyebilirsiniz (IBDAC içinde bileşenler değişecek ancak kod aynı olacaktır):

Kod: Tümünü seç

  UniConnection1.Close();
  UniConnection1.ProviderName := 'Interbase';
  // 64Bit işletim sisteminde 32Bit uygulama 32Bit client DLL kullanmalıdır.
  UniConnection1.SpecificOptions.Values['ClientLibrary'] := 'C:\Program Files\Firebird\Firebird_2_5\WOW64\fbclient.dll';

  UniScript1.SQL.Clear();
  UniScript1.SQL.Add('CREATE DATABASE ''localhost:C:\DB\test_unidac.fdb'''); // ilgili sunucu (localhost) ve oluşturulacak veritabanı adı tam yol olarak belirtilmeli
  UniScript1.SQL.Add('USER ''SYSDBA'' PASSWORD ''masterkey''');
  UniScript1.SQL.Add('PAGE_SIZE 16384');
  UniScript1.SQL.Add('DEFAULT CHARACTER SET WIN1254'); // Türkçe karakter desteği için WIN1254 kullanılmalı
  UniScript1.NoPreconnect := True;
  UniScript1.Execute(); // Burada artık veritabanı oluşturuluyor
Veritabanı oluşturulduktan sonra her zaman yaptığınız gibi bağlantı sağlayabilirsiniz.
bnyamin
Üye
Mesajlar: 44
Kayıt: 01 Mar 2019 12:55

Re: Otomatik Veritabanı Oluşturma

Mesaj gönderen bnyamin »

Teşekkür ederim Sayın Ertank hocam yardımlarınız için.
bnyamin
Üye
Mesajlar: 44
Kayıt: 01 Mar 2019 12:55

Re: Otomatik Veritabanı Oluşturma

Mesaj gönderen bnyamin »

Arkadaşlar uzun bir süredir yazılıma ara vermiştim ve şimdi tekrardan devam edeceğim inşallah en son otomatik veritabanı oluşturma işleminde kalmıştım ve araştırmalarım sonucunda aşağıdaki kodu buldum. ancak kod hata veriyor aceba nerde yanlış yapmış olabilirim şimdiden yardımlarınız için teşekkür ederim. (hata mesajı:unavailable database)

procedure TOlustur.SpeedButton1Click(Sender: TObject);
var
Yol:String;
Begin
Yol:=GetCurrentDir+'\'+Edit1.Text+'.GDB'; //Veritabanı adı hazırlanıyor

//Database ayarlanıyor
IBDatabase1.DataBaseName:=Yol;;
IBDatabase1.SQLDialect:=3;
IBDatabase1.LoginPrompt:=False;

//Database Oluşturuluyor
IBDatabase1.CreateDatabase;

//Database oluşturuldu artık table,view,generator ve stored procedure oluşturmaya geçebiliriz.
//Parametreler yenileniyor Normal bağlantı parametrelerine dönülüyor.
IBDatabase1.Connected:=False;
IBDatabase1.Params.Values['User_Name']:='SYSDBA';
IBDatabase1.Params.Values['PassWord']:='masterkey';
IBDatabase1.Params.Values['lc_ctype']:='WIN1254';
//Database Connect ediliyor
IBDatabase1.Connected:=True;
//Transaction Active ediliyor..
IbTransaction1.Active:=True;

//Table,index, view,generator ve stored procedurelerden 1 er tane örnek vereceğim
//Table oluşturuluyor

Try
IBSQL1.Close;

IBSQL1.SQL.Clear;
IBSQL1.SQL.Add('CREATE TABLE "VASIF" ("KNO" DOUBLE PRECISION NOT NULL,');
IBSQL1.SQL.Add('"VASIFLAR" VARCHAR(50) CHARACTER SET WIN1254 COLLATE PXW_TURK,');
IBSQL1.SQL.Add('"YEVMIYE" DOUBLE PRECISION,');
IBSQL1.SQL.Add('"TRH" TIMESTAMP,');
IBSQL1.SQL.Add('PRIMARY KEY ("KNO"))');
IBSQL1.Prepare;
IBSQL1.ExecQuery; //IBQuery kullanıyorsanız ExecQuery yerine ExecSQL yazacaksınız..
Finally
IBSQL1.Close;
end;

//İndex oluşturuluyor
Try
IBSQL1.Close;
IBSQL1.SQL.Clear;
IBSQL1.SQL.Add('CREATE INDEX VASIFLARX ON BELGE ("VASIFLAR")');
IBSQL1.Prepare;
IBSQL1.ExecQuery; //IBQuery kullanıyorsanız ExecQuery yerine ExecSQL yazacaksınız..
Finally
IBSQL1.Close;
end;

//View oluşturuluyor
Try
IBSQL1.Close;
IBSQL1.SQL.Clear;
IBSQL1.SQL.Add('CREATE VIEW "TOPLA" ("KNO","YIL","AY","DN","ODESASGUN","ODESASMAT",');
IBSQL1.SQL.Add('"GELIRVRGMAT","GELIRVERGISI","PIRIM") AS ');
IBSQL1.SQL.Add('SELECT KIMLIK.KNO,BORDRO.YIL,BORDRO.AY,BORDRO.DN,BORDRO.ODESASGUN,');
IBSQL1.SQL.Add('BORDRO.ODESASMAT,BORDRO.GELIRVRGMAT,BORDRO.GELIRVERGISI,');
IBSQL1.SQL.Add('(BORDRO.SSKISVEREN+BORDRO.ISSIZKURUM+BORDRO.SSKISCI+BORDRO.ISSIZISCI) FROM BORDRO,KIMLIK');
IBSQL1.SQL.Add('WHERE KIMLIK.KNO=BORDRO.DETAYNO');
IBSQL1.Prepare;
IBSQL1.ExecQuery; //IBQuery kullanıyorsanız ExecQuery yerine ExecSQL yazacaksınız..
Finally
IBSQL1.Close;
end;

//Generator oluşturuluyor
Try
IBSQL1.Close;
IBSQL1.SQL.Clear;
IBSQL1.SQL.Add('CREATE GENERATOR "VASIF_GEN"');
IBSQL1.Prepare;
IBSQL1.ExecQuery; //IBQuery kullanıyorsanız ExecQuery yerine ExecSQL yazacaksınız..
Finally
IBSQL1.Close;
end;


//Stored Procedure oluşturuluyor autoinc field için
Try
IBSQL1.Close;
IBSQL1.SQL.Clear;
IBSQL1.SQL.Add('CREATE PROCEDURE "PROC_VASIF"');
IBSQL1.SQL.Add('RETURNS');
IBSQL1.SQL.Add('(');
IBSQL1.SQL.Add(' "NUM" INTEGER');
IBSQL1.SQL.Add(')');
IBSQL1.SQL.Add('AS');
IBSQL1.SQL.Add('BEGIN');
IBSQL1.SQL.Add('NUM = GEN_ID(VASIF_GEN,1);');
IBSQL1.SQL.Add('END');
IBSQL1.Prepare;
IBSQL1.ExecQuery; //IBQuery kullanıyorsanız ExecQuery yerine ExecSQL yazacaksınız..
Finally
IBSQL1.Close;
end;

IBDatabase1.Connected:=False;
ÖM AraDüzenle Sil Cevapla Alıntı Rapor Et
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Otomatik Veritabanı Oluşturma

Mesaj gönderen ertank »

Merhaba,

Öncelikle paylaştığınız kod olacağında "Tam Editor & Önizleme" butonu altındaki kod özelliklerini kullanmanız okunabilirlik açısından çok fyadalı olacaktır.

Paylaştığınız kod ile ilgili olarak ilk göze çarpanlar;
1- Kod içinde hata aldığınız satırı bildirmemişsiniz. Hata mesajı veritabanı oluşturma değil veritabanı bağlantı hatasına benziyor. Belirttiğiniz hatadan önce başka hata oluşuyor olmasından şüphe ediyorum. Bunu iyice inceleyip bilgi vermenizde fayda var.
2- Edit1 nesnesi ile ayarlanan dosya adı sistemde mevcut mu kontrolü yapmamışsınız. Sistemde mevcut bir dosya var ise veritabanı oluşturma sırasında sorun yaşamanız olası.
3- Veritabanı oluşturmadan önce IBDatabase1 parametreleri ayarlanmamış. İlgili kod bunu yapmıyor. Çalışma zamanında ayarlıyor iseniz bu konuda sorun olmaması gerekli.
4- Veritabanı oluşturma parametreleri ile veritabanına bağlantı parametreleri arasında kullandığınız veritabanı erişim bileşenleri için farklılık vardır. Veritabanı oluşturmak için USER, bağlantı kurmak için USER_NAME parametresi kullanılıyor olmalı IBX bileşenleri için. Bunu kotrol etmenizde fayda var. Aşağıdaki bağlantı bu konuda bilgi içeriyor.
http://docs.embarcadero.com/products/ra ... abase.html
Cevapla