Veritabanı Güncelleme(Firebird)

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Veritabanı Güncelleme(Firebird)

Mesaj gönderen NewMember »

Arkadaşlar;
Malum veritabanı programlaması ile uğraşırken karşımıza çıkan sorunlardan birisi de zaman içerisinde veritabanında meydana gelen veya gelmesi kaçınılmaz olan değişiklikler ve bu değişiklikleri eski kullanıcılara sorun yaşamadan yansıtabilmektir.Exemizde yapmış olduğumuz değişiklikleri yada ek dosyalarımızdaki değişiklikleri yeni sürüm paketimize dahil ederek karşı bilgisayara kurulmasını sağlamak zor değildir.Ancak yeni setupımızda yeni ve değişik alanlar eklenmiş veritabanını koyamayız.Koysak ta bu programımızı ilk defa kuran kullanıcılar içindir.
(Bunu setup scriptleri ile ayarlamak zor değildir.Sanırım bu konuda da bir sıkıntı yok.Bunu setup programımızda eğer veritabanı dosyası varsa kurma, yok ise kur ve uninstall ayarlarında da database dosyasını asla kaldırma parametreleri ile ayarlarız.)Biz burada şunu yapmaya çalışacağız.Eğer setup programımız ile programımızı kuran kullanıcının bilgisayarında veritabanı mevcut değilse veritabanı dosyasını oluştur eğer varsa da mevcut dosyayı yeni dosya ya güncelleme olayıdır.Yine bu forumdan öğrendiğim mantıkla ben Firebird veritabanı kullandığım projelerimde şöyle bir metod kullanıyorum.Onu izah etmeye çalışacağım.


Öncelikle Veritabanı dosyamızın adı Data.FDB olsun.
Bu veritabanında bir adet DATAVERSION adında tablo açarız.Ve bu tabloda da VERSION diye bir alan açarız.Smallint tipinde.Veritabanı ilk oluşturulduğunda bu alanın değerini 1 yazarız.Yan, veritabanının 1.versiyon olduğunu teyit eden bir değer.

Sonra diyelim ki zaman içerisinde bu veritabanında bazı tablolar ekledik.Ya da bazı tablolara yeni alanlar ekledik.Yada bazı alanları silmek zorunda kaldık.Bu işlemlerin SQL kodlarını ise bir SQL uzantılı dosyaya kaydederiz.Mesela program dizinimiz içinde Update klasörü açar içinede Update2.SQL dosyasına kaydederiz.(Yani veritabanımızı 2.versiyona terfi ettirecek dosya anlamında)

Mesela aşağıda örnek bir SQL güncelleme kodu var.(Bu kodları IBExpertten tablonun DDL kodunu alarak yada tabloları yada alanları oluştururken IBExpert zaten bunların SQL kodlarını göstermektedir.)Programımı ilk yazdığımda UCRETLER tablosu yokmuş bu tabloyu sonradan eklemişim.Ama mevcut kullanıcıların veritabanlarında böyle bir tablo yok.Yeni veritabanını kuramazlar.Çünkü eski kayıtlarını nasıl kullanırlar o zaman.Yeni exeyide bu şekilde kurarlarsa veritabanı ile exe arasında uyumsuzluk olacaktır.Ucretler tablosunun SQL kodunu IBExpertten aldım.

Kod: Tümünü seç

/******************************************************************************/
/****                                                           ****/
/****              Bu Script Veritabanı versiyonu 1 olan veritabanını      ****/
/****              Son Versiyona Günceller.Yani Veritabanı 1.Sürüm Olan    ****/
/****              Kullanıcının Veritabanı ile Son Versiyon Arasındaki     ****/
/****              Farkları Kaldıran iki versiyonu birbirine               ****/
/****              eşitleyen ayarları içerir.                              ****/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES WIN1254;



/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/



CREATE TABLE UCRETLER (
    KAYITID         IDNO /* IDNO = NUMERIC(18,0) NOT NULL */,
    MUSTERIKODU     IDNO /* IDNO = NUMERIC(18,0) NOT NULL */,
    ISLEMADI        DMNAD /* DMNAD = VARCHAR(50) */,
    BORC            NUMERIC(15,2) DEFAULT 0,
    ALACAK          NUMERIC(15,2) DEFAULT 0,
    TAHAKKUKTARIHI  DATE,
    VADETARIHI      DATE    
);




/******************************************************************************/
/****                             Primary Keys                             ****/
/******************************************************************************/

ALTER TABLE UCRETLER ADD CONSTRAINT PK_UCRETLER PRIMARY KEY (KAYITID) USING INDEX PK_UCRETLER;


/******************************************************************************/
/****                               Triggers                               ****/
/******************************************************************************/


SET TERM ^ ;


/******************************************************************************/
/****                         Triggers for tables                          ****/
/******************************************************************************/



/* Trigger: UCRETLERCHNG */
CREATE TRIGGER UCRETLERCHNG FOR UCRETLER
ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 0
AS
begin
  post_event 'UCRETLERDEGISTI';
end
^


SET TERM ; ^



/******************************************************************************/
/****                              Privileges                              ****/
/******************************************************************************/

CREATE GENERATOR GNUCRETLERID;

/******************************************************************************/
/****                              Privileges                              ****/
/******************************************************************************/
/******************************************************************************/
/****                                                        ****/
/****              Bu Script Veritabanı versiyonu 1 olan veritabanını      ****/
/****              Son Versiyona Günceller.Yani Veritabanı 1.Sürüm Olan    ****/
/****              Kullanıcının Veritabanı ile Son Versiyon Arasındaki     ****/
/****              Farkları Kaldıran iki versiyonu birbirine               ****/
/****              eşitleyen ayarları içerir.                              ****/
/******************************************************************************/


Sonra ise exenizin kodlarının içine veritabanı tablolarınıza bağlanmadan önce sadece veritabanınızdaki DATAVERSION adlı tabloya bağlanarak VERSION alanının değer, kontrol edilir.Eğer 2 ise hiçbirşey yapılmadan diğer tablolara da bağlanılmasına izin verilir.

Ama eğer 1 ise Update \ Update2.SQL script dosyası çalıştırılır.bu script dosyası veritabanını yeni veritabanına günceller.Script dosyasındaki ekleme-silme-düzenlemeleri yapar.Bu işlemin ardından ise DATAVERSION tablosundaki VERSION alanının değeri 2 yapılır.

Bu SQL scriptlerini çalıştırmak içinde Delhi 2005 ve sonrasında InterbaseAdmin sekmesinde bulunan IBScript componenti ile yapıyorum.Delphi 7 de bu component bulunmamaktadır.Ancak interbase bileşenlerini güncellerseniz component palette görebilirsiniz.

Kod: Tümünü seç

Var dbversionno:integer;
dbversionno:integer :=DM.datasetDATAVERSION.FieldbyName(‘VERSION’).asinteger;
case dbversionno of
  1: veritabanınıguncelle2;//Bu oluşturduğumuz procedur
  2:veritabanınıguncelle3 ; Bu oluşturduğumuz procedur
  3:veritabanınıguncelle4 ; Bu oluşturduğumuz procedur
  4:veritabanınıguncelle5 ; Bu oluşturduğumuz procedur
………………………..
………………………..
………………………..
………………………..
end;


VeritabaniniGuncelle 2, VeritabaniniGuncelle 3, VeritabaniniGuncelle 4, procedurlerinida aşağıdaki gibi oluşturabiliriz.

Kod: Tümünü seç


procedure TDM.VeritabaniniGuncelle2;
begin  
  //************************************************************
  IBScript1.Script.Clear;
  IBScript1.Script.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Update\ Update 2.SQL');
  IBScript1.ExecuteScript;
  //************************************************************
     //************************************************************
  DatabaseVersiyonTable.Edit;
  DatabaseVersiyonTable.FieldByName('DATAVERSION').AsInteger := 2;
  DatabaseVersiyonTable.Post;
  DatabaseVersiyonTransaction.CommitRetaining;
end;





Bu döngü bu şekilde halledilir.Tabi burada dikkat edilmesi gereken nokta şudur.veritabanı versiyonları arttıkça bunları güncelleyecek olan script dosyaları dikkatli oluşturulmak zorundadır.Yani versiyonu 1 olan veritabanını 5 nolu versiyona yükseltecek olan SQL scripti ile 3 nolu versiyonu 5 e yükseltecek olan script dosyası haliyle aynı olamayacağından bu konuda ben şöyle bir yol izliyorum.her versiyonda yapılan değişklikleri ayrı SQL dosyalarına kaydedip güncelleme yaparkende eğer mevcut database versiyonu 1 ise önce 2 ye sonra 2 yi 3 e, sonra 3 ü 4 e, sonrada 4 ü 5 e güncelleyen procedurleri çalıştırıyorum.

Eğer mevcut veritabanı versiyonuda 3 ise o na da 3 ü 4 e, sonrada 4 ü 5 e güncelleyen procedurleri çalıştırıyorum.

Bu şekilde hata olasılığı azalıyor.

Bu kod blokları çalıştıktan sonra ise program dosyanızın(EXE) diğer tablolara bağlanmasına izin verebiliriz.


Bu sistemi yaklaşık 1-1,5 yıldır kullanıyorum.İlk başlarken 1 olan veritabanı versiyonu şu an için 8.Hiç bir şekilde bir sorun yaşamadım.Son derece stabil ve güzel ve basit mantıklı ama bir o kadarda iş gören bir yöntem.Ancak anlatımımdan kaynaklanan anlaşılamayan hususlar olursa da soru cevaplarla topik olgunlaşır kanaatindeyim.
Uzun zamandır işlerin yoğunluğundan foruma pek bir katkımız olmamaktaydı.
Belki bu vesileyle bu konuda sıkıntısı olan arkadaşlara bir nebzede faydamız olursa ne mutlu bize.
Herkese kolay gelsin.
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

Emeğinize teşekkür ediyorum.Firebird için ne zamandır beklediğim makale.Makaleyi bir kaç kez okudum.Ama takıldığım noktalar var.İşin mantığını anladım.
Tablo yada alan oluşturma işlemlerini IBExpertin SQL kodlarını kullanarak yapabiliyoruz.Fakat bu sql kod oluşumunu delphi tarafından nasıl bir sıralamaya koyabiliriz.Yani önce şu tabloyu yap sonra şu tabloya şu alanı ekle sonra genarotor sonra trıger tanımla gibi bir sırala şekli bunlar iç içe mi yazılıyor.Yoksa IBExpert deki gibi ayrı ayrımı.Dediğiniz sekilde bir versiyon tablosu yaptım.ama bundan daha ileri gidemedim.
Update2.SQL dosyasına kaydederiz.
bu nasıl olşturulup kaydediliyor ve çalıştırılıyor.
Ama eğer 1 ise Update \ Update2.SQL script dosyası çalıştırılır.
Bu SQL scriptlerini çalıştırmak içinde Delhi 2005 ve sonrasında InterbaseAdmin sekmesinde bulunan IBScript componenti ile yapıyorum.Delphi 7 de bu component bulunmamaktadır.Ancak interbase bileşenlerini güncellerseniz component palette görebilirsiniz
Delphi7 kullanıyorum.interbase bileşenlerini nasıl güncelleyeceğiz.IBScript componentin kullanımı hakkındad da bilgi verirseniz sevinirim.

Ayrıca kodları nereye yazacağız burada tam olarak işin içinden çıkamadım.Şimdiden teşekkürler
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

haydarxxx yazdı: Delphi7 kullanıyorum.interbase bileşenlerini nasıl güncelleyeceğiz.
ibscript olarak forumda aramaniz yeterli...
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Mesaj gönderen NewMember »

Fakat bu sql kod oluşumunu delphi tarafından nasıl bir sıralamaya koyabiliriz.Yani önce şu tabloyu yap sonra şu tabloya şu alanı ekle sonra genarotor sonra trıger tanımla gibi bir sırala şekli bunlar iç içe mi yazılıyor.
Şimdi şöyle izah edeyim.Siz v eritabanına diyelimki yeni bir tablo yada var olan tabloya yeni bir alan eklediniz.Eğer bunu IBExpertte yapıyorsanız zaten o anda Oluştur(Execute) dediğinizde IBExpert yeni bir pencere için de sizin görsel olarak yaptığınız tablo ekleme, alan ekleme, generatör ekleme,trigger ekleme veya bunları silme veya değiştirme olayının SQL kodunu gösterir.Siz commit ettiğinizdede bunu veritabanına yazar.Sizde buradan aldığınız kodu bir text dosyaya yazarsınız.Not defteri ile bir metin belgesi açar ve kaydedersiniz.Ben adına Update.SQL dedim.Siz Guncelleme.XXX diyebilrisiniz.uzantı ve isim olarak istediğinizi verin.

Sonra yeni bir düzenleme daha yaptınız.bu sefer bu dosyayı tekrar açar ve o değişikliklerin kodunu buraya atarsınız.sonra diyelimki artık yapacaığınız değişiklikler bitti ve programınızın yeni halini paketleyeceksiniz.Bu update.xxx dosyasınıda pakete dahil ettiniz.ve programınızın açılışında db versiyonunu kontrol ettirdiniz.DB versiyonu 2 ise(son versiyon desek daha doğru olur) hiç bişey yapmadan dbye bağlanıp diğer tabloları açtırdınız.Ama eğer 1 ise kurulum paketi ile karşı pc ye attığınız bu update.xxx dosyasındaki SQL komutlarını İBexpert yerine kendi exemize yaptırtmak.

örnek.

Kod: Tümünü seç

/******************************************************************************/ 
/****                                                           ****/ 
/****              Bu Script Veritabanı versiyonu 1 olan veritabanını      ****/ 
/****              Son Versiyona Günceller.Yani Veritabanı 1.Sürüm Olan    ****/ 
/****              Kullanıcının Veritabanı ile Son Versiyon Arasındaki     ****/ 
/****              Farkları Kaldıran iki versiyonu birbirine               ****/ 
/****              eşitleyen ayarları içerir.                              ****/ 
/******************************************************************************/ 

SET SQL DIALECT 3; 

SET NAMES WIN1254; 



/******************************************************************************/ 
/****                                Tables                                ****/ 
/******************************************************************************/ 



CREATE TABLE UCRETLER ( 
    KAYITID         IDNO /* IDNO = NUMERIC(18,0) NOT NULL */, 
    MUSTERIKODU     IDNO /* IDNO = NUMERIC(18,0) NOT NULL */, 
    ISLEMADI        DMNAD /* DMNAD = VARCHAR(50) */, 
    BORC            NUMERIC(15,2) DEFAULT 0, 
    ALACAK          NUMERIC(15,2) DEFAULT 0, 
    TAHAKKUKTARIHI  DATE, 
    VADETARIHI      DATE    
); 




/******************************************************************************/ 
/****                             Primary Keys                             ****/ 
/******************************************************************************/ 

ALTER TABLE UCRETLER ADD CONSTRAINT PK_UCRETLER PRIMARY KEY (KAYITID) USING INDEX PK_UCRETLER; 


/******************************************************************************/ 
/****                               Triggers                               ****/ 
/******************************************************************************/ 


SET TERM ^ ; 


/******************************************************************************/ 
/****                         Triggers for tables                          ****/ 
/******************************************************************************/ 



/* Trigger: UCRETLERCHNG */ 
CREATE TRIGGER UCRETLERCHNG FOR UCRETLER 
ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 0 
AS 
begin 
  post_event 'UCRETLERDEGISTI'; 
end 
^ 


SET TERM ; ^ 



/******************************************************************************/ 
/****                              Privileges                              ****/ 
/******************************************************************************/ 

CREATE GENERATOR GNUCRETLERID; 

/******************************************************************************/ 
/****                              Privileges                              ****/ 
/******************************************************************************/ 
/******************************************************************************/ 
/****                                                        ****/ 
/****              Bu Script Veritabanı versiyonu 1 olan veritabanını      ****/ 
/****              Son Versiyona Günceller.Yani Veritabanı 1.Sürüm Olan    ****/ 
/****              Kullanıcının Veritabanı ile Son Versiyon Arasındaki     ****/ 
/****              Farkları Kaldıran iki versiyonu birbirine               ****/ 
/****              eşitleyen ayarları içerir.                              ****/ 
/******************************************************************************/ 



IBScript componenti bu işi yapar.kullanımı gayet basittir.Datamodulun üstüne koy.Database bağlantısını tasarım anında yap.birde bir önceki mesajımda da da verdiğim kodu çalıştır yeter.

Kod: Tümünü seç

procedure TDM.VeritabaniniGuncelle2; 
begin  
  //************************************************************ 
  IBScript1.Script.Clear; 
  IBScript1.Script.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Update\ Update 2.SQL'); 
  IBScript1.ExecuteScript; 
  //************************************************************ 
     //************************************************************ 
  DatabaseVersiyonTable.Edit; 
  DatabaseVersiyonTable.FieldByName('DATAVERSION').AsInteger := 2; 
  DatabaseVersiyonTable.Post; 
  DatabaseVersiyonTransaction.CommitRetaining; 
end; 

Kodun sırası falan pek önemli değil.Ibscript nesnesi IBExpertin kod syntaxını tanır.Mesela kodda açıklama filanda yazılabilir. Ama sıra tabii ki şu manada önemlidir.Bir PK tanımlarken bu kodu o alanın create kodundan önce yazrasanız pek tabii hata verecektir olmayan bir alanı PK tanımlamak isteyeceğinizden dolayı.Ancak pratikte bunun bir önemi yok.yani siz IBExpertte değişikliği yapıp kodunu da alt alta bu text dosyaya yazın ve de bu text dosyayı runtimede IBScript nesnesine yükleyerek execute edin.


Kolay Gelsin.
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

sadettinpolat hocam forumda aradaım hatta sisin verdiğiniz bir link de var ama bu D6 için.D7 link i bulamadım.

Tmm sonra buldum http://codecentral.borland.com/Item/20257
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

Hocam biraz daha yardım.
InterBase yi D7 için güncelledim.IbExperte 2 tane tablo yaptım
1.tablom dediğiniz gibi DATAVERSIYON ve VERSIYON(SmallInt) e 1 şeklinde değer girdim.
2.Tablom ise UCRETLER ve gerekli alanları oluşturdum DLL si aşağıdaki gibi

Kod: Tümünü seç

/******************************************************************************/
/****              Generated by IBExpert 21.02.2008 16:30:17               ****/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES WIN1254;



/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/



CREATE TABLE UCRETLER (
    KAYITID         NUMERIC(18,2) NOT NULL,
    MUSTERIKODU     NUMERIC(18,2),
    ISLEMADI        VARCHAR(10),
    BORC            NUMERIC(15,2),
    ALACAK          NUMERIC(15,2),
    TAHAKKUKTARIHI  DATE,
    VADETARIHI      DATE
);




/******************************************************************************/
/****                             Primary Keys                             ****/
/******************************************************************************/

ALTER TABLE UCRETLER ADD CONSTRAINT PK_UCRETLER PRIMARY KEY (KAYITID);


/******************************************************************************/
/****                              Privileges                              ****/
/******************************************************************************/
ve dll yi text dosyasına yapıştırdım ve text uzantısını sql yaptım c:\Versiyon\Update\update.sql şeklinde

form üzerine
IBDataSet1------->DATAVERSIYON tablosuna bağladım
IBDataSet2------->UCRETLER tablosuna bağladım.IBScript1 in datasetinide IBDataSet2 bağladım ve aşağıda sizin verdiğiniz kodları kendime göre denedim

Kod: Tümünü seç

  private
    procedure VeritabaniniGuncelle2;
    { Private declarations }
  public

    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure VeritabaniniGuncelle2;
begin

  //************************************************************
  IBScript1.Script.Clear;
  IBScript1.Script.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Update\update.sql');
  IBScript1.ExecuteScript;
  //************************************************************
     //************************************************************
  IBDataSet1.Edit;
  IBDataSet1.FieldByName('VERSIYON').AsInteger := 2;
  IBDataSet1.Post;
  IBTransaction1.CommitRetaining;
end;
ve butona da

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
Var
dbversionno:integer;
begin
dbversionno:=IBDataSet1.FieldByName('VERSIYON').AsInteger;
case dbversionno of
  1: veritabanınıguncelle2;//Bu oluşturduğumuz procedur

end;
yazdım.Buaraya kadar doğrumudur yaptığım işlem bilmiyorum

şu hatayı alıyorum

Kod: Tümünü seç

[Error] Unit1.pas(45): Undeclared identifier: 'IBScript1'
[Error] Unit1.pas(45): Missing operator or semicolon
[Error] Unit1.pas(46): Missing operator or semicolon
[Error] Unit1.pas(47): Missing operator or semicolon
[Error] Unit1.pas(50): Undeclared identifier: 'IBDataSet1'
[Error] Unit1.pas(50): Missing operator or semicolon
[Error] Unit1.pas(51): Missing operator or semicolon
[Error] Unit1.pas(51): Missing operator or semicolon
[Error] Unit1.pas(52): Missing operator or semicolon
[Error] Unit1.pas(53): Undeclared identifier: 'IBTransaction1'
[Error] Unit1.pas(53): Missing operator or semicolon
[Error] Unit1.pas(62): Undeclared identifier: 'veritaban'
[Error] Unit1.pas(62): Illegal character in input file: 'ı' ($FD)
[Error] Unit1.pas(67): ';' expected but '.' found
[Error] Unit1.pas(69): Declaration expected but end of file found
[Error] Unit1.pas(27): Unsatisfied forward or external declaration: 'TForm1.VeritabaniniGuncelle2'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Mesaj gönderen NewMember »

Kod: Tümünü seç

Error] Unit1.pas(45): Undeclared identifier: 'IBScript1' 
IBScript diye bir değişkeninin tanımlanmadığını söylüyor.eğer interbase güncellemesini yapabildiyseniz gerçekten InterbaseAdmin paletine bu bileşen gelmeli ve oradan bir tane alıp formun üzerine(Datamodul) koymalısınız.Ayrıca IBScripti herhangi bir datasetle ilişkilendirmiyorsunuz.Sadece database ile ilişkilendirmeniz yeterli.
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

Hocamhttp://codecentral.borland.com/Item/20257 linkinden güncelledim.Fakat bende InterbaseAdmin paletine değil Interbase paletine geldi.Orada da IBScript var :? Resim
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Mesaj gönderen NewMember »

illegal karakterleride değiştirerek tekrar dene.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject); 
Var 
dbversionno:integer; 
begin 
dbversionno:=IBDataSet1.FieldByName('VERSIYON').AsInteger; 
case dbversionno of 
  1: veritabanınıguncelle2;//Bu oluşturduğumuz procedur 

end;
veritabanınıguncelle2 Yerine veritabaniniguncelle2 yazmalısın.Bu syntax hatasını düzelttikten sonrada hata verirse ondan sonra bakmak lazım.
En son NewMember tarafından 22 Şub 2008 11:32 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

illegal karakterleride değiştirerek tekrar dene.
be nedemek anlamadım :?
khanco
Üye
Mesajlar: 226
Kayıt: 01 Eki 2007 04:39
Konum: İzmir
İletişim:

Mesaj gönderen khanco »

haydarxxx yazdı:
illegal karakterleride değiştirerek tekrar dene.
be nedemek anlamadım :?
türkçe karakter kullanma demek, İngilizcede bulunan 26 harf dişindakileri kabul etmeyeceğini söylüyor
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

tmm hocam tr karakterini düzenledim.Ama aynı hata devam ediyor :?

Hocam yazmış olduğunuz procedure den kaynaklanıyor procedure tanımlamsını mı yanlış yapıyorum :? IBScript1 satırına geldiğinde hatayı veriyor.Bir de Ibexpert den hangi table ise onun DLL bölümünden alıyorum sql kodunu doğrumudur.

Kod: Tümünü seç

 private
    procedure VeritabaniniGuncelle2;
    { Private declarations }
  public

    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure VeritabaniniGuncelle2;
begin
  //************************************************************
  IBScript1.Script.Clear;// Hatanın başlangıcı 
  IBScript1.Script.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Versiyon\Update\update.sql');
  IBScript1.ExecuteScript;
  //************************************************************
     //************************************************************
  DatabaseVersiyonTable.Edit;
  DatabaseVersiyonTable.FieldByName('VERSIYON').AsInteger := 2;
  DatabaseVersiyonTable.Post;
  DatabaseVersiyonTransaction.CommitRetaining;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Var dbversionno:integer;
dbversionno:integer := DatabaseVersiyonTable.FieldbyName('VERSIYON').asinteger;
case dbversionno of
  1: veritabaniniguncelle2;//Bu oluşturduğumuz procedur

end;
procedure yi butona yazarak denediğim de tableyi yaratıyor.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
//************************************************************
  IBScript1.Script.Clear;
  IBScript1.Script.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Update\Update.SQL');
  IBScript1.ExecuteScript;
  //************************************************************
     //************************************************************
  IBDataSet1.Edit;
  IBDataSet1.FieldByName('DATAVERSIYON').AsInteger := 2;
 IBDataSet1.Post;
  IBTransaction1.CommitRetaining;
end;
bir kaç sorum olacak
1.Butona bastığımızda tabloyu oluşturuyor fakat şöyle bir hata veriyor.
unsuccessful metadata update
Table UCRETLER already exists
2.tabloya veri girilmiş ise ve bu tabloya SQL ile bir alan eklemek istediğimizde yeni alanı eklemiyor
3.sql ile tabloya yeni bir alan eklediğimizde var olan kayıtlar silinirmi
4.Tüm bu kontroller nasıl yapılıyor.Gerçi açıklamışsınız veriyon1 den versiyon2 ye geçme için Vt den kontrol ettireceğiz ama kişini verilerinde bir bozulma olurmu.
Cevapla