Otomatik Veritabanı Oluşturma
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Otomatik Veritabanı Oluşturma
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.
Re: Otomatik Veritabanı Oluşturma
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?
Ö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?
Re: Otomatik Veritabanı Oluşturma
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.
Re: Otomatik Veritabanı Oluşturma
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:
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):
Veritabanı oluşturulduktan sonra her zaman yaptığınız gibi bağlantı sağlayabilirsiniz.
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
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
Re: Otomatik Veritabanı Oluşturma
Teşekkür ederim Sayın Ertank hocam yardımlarınız için.
Re: Otomatik Veritabanı Oluşturma
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
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
Re: Otomatik Veritabanı Oluşturma
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
Ö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