Kodbank İndir

! CODEBANK 2012 !

İNDİRMEK&DETAYLI BİLGİ ALMAK İÇİN BURAYI TIKLAYINIZ.

ÖNEMLİ AÇIKLAMA: MUTLAKA OKUYUNUZ!

Gönderen Konu: Text/Script Dosyadan Sql Server Veritabanı ve Tablolarını Oluşturma  (Okunma sayısı 3239 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı dynamo

  • Kıdemli Üye
  • *****
  • İleti: 120
  • Rep: +3/-1
Farklı veritabanları ve tablolarını oluştururken her biri için ayrı bir proje oluşurmak yada aynı projede kullanılan tabloların sürekli güncellenmesi/değiştirilmesi aynı zamanda program kodlarının da değiştirilmesi ve programın tekrar derlenmesini gerektirir.Bunun yerine sql kodlarını bir text/script dosyadan okuyup veritabanı ve tablolarını oluşturmak daha pratik olacaktır.

Örnek Uygulama

1-)Program Kodu ile tabloları oluşturma:



sql server'ün çalışıp çalışmadığını kontrol edecek fonksiyon:

Kod: Delphi
  1. //SQL Server bağlantısını kontrol et
  2. function ConnectSqlDatabase(UserName,Password,Server:string):Boolean;
  3. var
  4.    ADOConnection: OleVariant;   //uses ComObj;
  5. begin
  6.    ADOConnection := CreateOleObject('ADODB.Connection');
  7.    ADOConnection.CursorLocation := 3; // User client
  8.    ADOConnection.ConnectionString :='Provider=SQLOLEDB.1;Persist Security Info=False;Data Source='+Server+';User ID='+UserName+';Password='+Password;
  9.    try
  10.       ADOConnection.Open;
  11.       result:= true;
  12.    except
  13.       result:= false;
  14.    end;
  15. end;

program açıldığında bilgisayar adını "Server" kutusuna atsın:

Kod: Delphi
  1. function GetComputerName: string;
  2. var
  3.    buffer: array[0..MAX_COMPUTERNAME_LENGTH + 1] of Char;
  4.    Size: Cardinal;
  5. begin
  6.    Size := MAX_COMPUTERNAME_LENGTH + 1;
  7.    Windows.GetComputerName(@buffer, Size);
  8.    Result := StrPas(buffer);
  9. end;
  10.  
  11. procedure Tfrmcreatedb.FormShow(Sender: TObject);
  12. begin
  13.    Edit5.Text:= GetComputerName ;
  14. end;

veritabanı oluşturma:

Kod: Delphi
  1. Tfrmcreatedb.CreateSqlDatabase(server,database,user,password,database_dir,str_data_file,str_log_file:string):Boolean;
  2. begin
  3.    result:=false;
  4.  
  5.    //master veritabanına bağlan
  6.    ADOConnection1.Connected :=false;
  7.    ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=false;User ID='+user+';Initial Catalog=master;Password ='+password+';Data Source=' +server;
  8.    ADOConnection1.Connected := true;
  9.    if ADOConnection1.Connected then begin
  10.       ADOQuery1.Close;
  11.       ADOQuery1.SQL.Clear;
  12.       ADOQuery1.SQL.Add('select * from master..sysdatabases WHERE name='''+database+'''');
  13.       ADOQuery1.Open;
  14.       if  ADOQuery1.RecordCount >0 then begin  //veritabanını önceden oluşturulmuş
  15.          ShowMessage('Veritabanı Önceden Oluşturulmuş...');
  16.          exit;
  17.       end
  18.       else begin  //veritabanı yok, seçili dizi altında oluştur
  19.          ADOCommand1.Cancel();
  20.          ADOCommand1.CommandText:='CREATE DATABASE ['+database+']  ON (NAME = '+database+'_data, FILENAME = '''+str_data_file+''') LOG ON (NAME = '+database+'_log, FILENAME = '''+ str_log_file+''') COLLATE Turkish_CI_AS ';
  21.          ADOCommand1.Execute;
  22.  
  23.          //veritabanına bağlan
  24.          ADOConnection1.Connected :=false;
  25.          ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=false;User ID='+user+';Initial Catalog='+database+';Password ='+password+';Data Source=' +server;
  26.          ADOConnection1.Connected := true;
  27.          if ADOConnection1.Connected then begin
  28.             //tabloları oluştur
  29.             tablo_olustur;
  30.             result:=true;
  31.          end;
  32.       end;
  33.    end;
  34. end;

tabloları oluşturma:
   
Kod: [Seç]
procedure Tfrmcreatedb.tablo_olustur;
var
   SQL:string;
begin
   //---------------------------------------------------------------------
   SQL:='';
   SQL:=SQL+' IF NOT EXISTS (select * from dbo.sysobjects where id = object_id(N''[dbo].[stok_table]'') and OBJECTPROPERTY(id, N''IsUserTable'') = 1)';
   SQL:=SQL+' CREATE TABLE  [stok_table] ( ';
   SQL:=SQL+' Kod             VARCHAR ( 10) ,';
   SQL:=SQL+' Adi             VARCHAR ( 30) ,';
   SQL:=SQL+' Unvani          VARCHAR ( 50) ,';
   SQL:=SQL+' Birim           VARCHAR ( 10) ,';
   SQL:=SQL+' BirimCarpan     FLOAT ,';
   SQL:=SQL+' DepoKodu        VARCHAR ( 10) ,';
   SQL:=SQL+' GrupKodu        VARCHAR ( 10) ,';
   SQL:=SQL+' GirenMiktar     FLOAT ,';
   SQL:=SQL+' CikanMiktar     FLOAT ,';
   SQL:=SQL+' KalanMiktar     FLOAT ,';
   SQL:=SQL+' BirimFiyati     MONEY ,';
   SQL:=SQL+' Tarih           DATETIME ,';
   SQL:=SQL+' PRIMARY KEY   (Kod) )';
   ADOCommand1.Cancel();
   ADOCommand1.CommandText:=SQL;
   ADOCommand1.Execute;
   //---------------------------------------------------------------------
   SQL:='';
   SQL:=SQL+' IF NOT EXISTS (select * from dbo.sysobjects where id = object_id(N''[dbo].[sthr_table]'') and OBJECTPROPERTY(id, N''IsUserTable'') = 1)';
   SQL:=SQL+' CREATE TABLE  [sthr_table] ( ';
   SQL:=SQL+' Sira            BIGINT IDENTITY(1,1) NOT NULL ,';  //autoincrement alan
   SQL:=SQL+' EvrakTarihi     DATETIME ,';
   SQL:=SQL+' EvrakNo         VARCHAR ( 20) ,';
   SQL:=SQL+' StokKodu        VARCHAR ( 10) ,';
   SQL:=SQL+' StokAdi         VARCHAR ( 30) ,';
   SQL:=SQL+' Aciklama        VARCHAR ( 60) ,';
   SQL:=SQL+' Birim           VARCHAR ( 10) ,';
   SQL:=SQL+' BirimFiyati     MONEY ,';
   SQL:=SQL+' KdvOrani        INT ,';
   SQL:=SQL+' FaturaNo        VARCHAR ( 10) ,';
   SQL:=SQL+' KayitTarihi     DATETIME,';
   SQL:=SQL+' PRIMARY KEY   (Sira,EvrakTarihi,EvrakNo,StokKodu) )';
   ADOCommand1.Cancel();
   ADOCommand1.CommandText:=SQL;
   ADOCommand1.Execute;
   //---------------------------------------------------------------------
   SQL:='';
   SQL:=SQL+' IF NOT EXISTS (select * from dbo.sysobjects where id = object_id(N''[dbo].[fatura_table]'') and OBJECTPROPERTY(id, N''IsUserTable'') = 1)';
   SQL:=SQL+' CREATE TABLE  [fatura_table] ( ';
   SQL:=SQL+' FaturaNo        VARCHAR ( 10) ,';
   SQL:=SQL+' MusteriKodu     VARCHAR ( 10) ,';
   SQL:=SQL+' StokKodu        VARCHAR ( 10) ,';
   SQL:=SQL+' Aciklama        VARCHAR ( 60) ,';
   SQL:=SQL+' Birim           VARCHAR ( 10) ,';
   SQL:=SQL+' BirimFiyati     MONEY ,';
   SQL:=SQL+' StokMiktari     FLOAT ,';
   SQL:=SQL+' VadeTarihi      DATETIME ,';
   SQL:=SQL+' TahsilTarihi    DATETIME ,';
   SQL:=SQL+' KayitTarihi     DATETIME ,';
   SQL:=SQL+' PRIMARY KEY   (FaturaNo) )';
   ADOCommand1.Cancel();
   ADOCommand1.CommandText:=SQL;
   ADOCommand1.Execute;
   //---------------------------------------------------------------------
   
end;

Tamam butonu:

Kod: Delphi
  1. procedure Tfrmcreatedb.BitBtn3Click(Sender: TObject);
  2. begin
  3.    if Edit1.Text='' then begin
  4.       showmessage('Veritabanı Adını Giriniz....');
  5.       Edit1.SetFocus;
  6.       exit;
  7.    end;
  8.  
  9.    if Edit2.Text='' then begin
  10.       showmessage('Veritabanı Yolunu Giriniz....');
  11.       Edit2.SetFocus;
  12.       exit;
  13.    end;
  14.  
  15.    user:=trim(Edit3.Text);
  16.    password:=trim(Edit4.Text);
  17.    server:= trim(Edit5.Text);
  18.  
  19.    database:= trim(Edit1.Text);
  20.    database_dir:=trim(Edit2.Text)+'\';
  21.    str_data_file:= database_dir+database+'_data.mdf' ;
  22.    str_log_file:=  database_dir+database+'_log.mdf'  ;
  23.  
  24.    //sql server bağlantısını kontrol et
  25.    if ConnectSqlDatabase(user,password,server)=false then begin
  26.       Application.MessageBox('Sql server çalışmıyor...Servisini çalıştırdıktan sonra programı açınız...','sql server bağlantı hatası',MB_OK);
  27.       exit;
  28.    end;
  29.  
  30.    //sql servere veritabanı oluştur
  31.    if CreateSqlDatabase(server,database,user,password,database_dir,str_data_file,str_log_file) then
  32.       showmessage('Veritabanı ve Tabloları Oluşturuldu....')
  33.    else
  34.       showmessage('Hata....Veritabanı Oluşturulamadı........');
  35.  
  36. end;

veritabanını silip tekrar oluşturmak için sil işlemi-klavyeden F11 tuşuna basılırsa- FormKeyDown'da:

Kod: Delphi
  1. procedure Tfrmcreatedb.FormKeyDown(Sender: TObject; var Key: Word;
  2.   Shift: TShiftState);
  3. begin
  4.    case Key of
  5.       VK_F11: begin
  6.             if Application.MessageBox('Veritabanı Silinsin mi...?','UYARI',MB_YESNO)=ID_NO then exit;
  7.                user:=trim(Edit3.Text);
  8.                password:=trim(Edit4.Text);
  9.                server:= trim(Edit5.Text);
  10.                database:= trim(Edit1.Text);
  11.  
  12.                Screen.Cursor:=crHourGlass;
  13.                try
  14.                   ADOConnection1.Connected :=false;
  15.                   ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=false;User ID='+user+';Initial Catalog=master;Password ='+password+';Data Source=' +server;
  16.                   ADOConnection1.Connected := true;
  17.                   if (ADOConnection1.Connected) then begin
  18.                      try
  19.                         ADOCommand1.Cancel;
  20.                         ADOCommand1.CommandText:= 'USE master IF EXISTS(SELECT * FROM master..sysdatabases where name='''+database+''') DROP DATABASE '+database;
  21.                         ADOCommand1.Execute;
  22.                         showmessage('Veritabanı Silindi');
  23.                      except
  24.                         showmessage('Hata...Veritabanı Silinemedi....');
  25.                      end;
  26.                   end;
  27.                finally
  28.                   Screen.Cursor:=crDefault;
  29.                end;
  30.             end;
  31.    end;
  32. end;





2-)Dosyadan script okuyarak tabloları oluşturma:

dosyadaki tablo oluşturma sql ifadeleri:

Kod: SQL
  1. IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[stok_table]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
  2. CREATE TABLE  [stok_table] (
  3. Kod       VARCHAR (10) ,
  4. Adi        VARCHAR (30) ,
  5. Unvani     VARCHAR (50) ,
  6. Birim  VARCHAR ( 10) ,
  7. BirimCarpan  FLOAT ,
  8. DepoKodu       VARCHAR (10) ,
  9. GrupKodu VARCHAR (10) ,
  10. GirenMiktar     FLOAT ,
  11. CikanMiktar     FLOAT ,
  12. KalanMiktar     FLOAT,
  13. BirimFiyati     MONEY,
  14. Tarih           DATETIME,
  15. PRIMARY KEY     (Kod) )
  16.  
  17. GO
  18.  
  19. IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[sthr_table]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
  20. CREATE TABLE  [sthr_table] (
  21. Sira            BIGINT IDENTITY(1,1) NOT NULL ,
  22. EvrakTarihi     DATETIME ,
  23. EvrakNo         VARCHAR ( 20) ,
  24. StokKodu        VARCHAR ( 10) ,
  25. StokAdi         VARCHAR ( 30) ,
  26. Aciklama        VARCHAR ( 60) ,
  27. Birim           VARCHAR ( 10) ,
  28. BirimFiyati     MONEY ,
  29. KdvOrani        INT ,
  30. FaturaNo        VARCHAR ( 10) ,
  31. KayitTarihi     DATETIME,
  32. PRIMARY KEY   (Sira,EvrakTarihi,EvrakNo,StokKodu) )
  33.    
  34. GO
  35.  
  36. IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[fatura_table]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
  37. CREATE TABLE  [fatura_table] (
  38. FaturaNo        VARCHAR ( 10) ,
  39. MusteriKodu     VARCHAR ( 10) ,
  40. StokKodu        VARCHAR ( 10) ,
  41. Aciklama        VARCHAR ( 60) ,
  42. Birim           VARCHAR ( 10) ,
  43. BirimFiyati     MONEY ,
  44. StokMiktari     FLOAT ,
  45. VadeTarihi      DATETIME ,
  46. TahsilTarihi    DATETIME ,
  47. KayitTarihi     DATETIME ,
  48. PRIMARY KEY   (FaturaNo) )
  49.  

ADOConnection1'in bağlı olduğu veritabanında text dosyadan sql scriptlerini okuyarak tabloları oluşturma kodu aşağıdaki gibidir."GO" ifadesi her tabloya ait sql kodlarını ayırır(bir tablo oluşturulduktan sonra diğer tabloyu oluşurur).

Kod: [Seç]
procedure Tfrmcreatedb.Button1Click(Sender: TObject);
var
   s        :string;
   sqltext  :string;
   sqlfile  :TextFile;
begin
   OpenDialog1.Filter:='Text Dosyası|*.txt';
   OpenDialog1.InitialDir:= ExtractFilePath(Application.ExeName);
   if OpenDialog1.Execute then
   begin
      AssignFile(sqlfile,OpenDialog1.FileName);
      FileMode:=0;
      Reset(sqlfile);
      try
         //ADOConnection1.BeginTrans;
         while not eof(sqlfile) do
         begin
            Readln(sqlfile,s);
            sqltext:=s;
            while (not eof(sqlfile)) and (uppercase(trim(s))<>'GO') do
            begin
               Readln(sqlfile,s);
               if (uppercase(trim(s))<>'GO') then
                  sqltext:=sqltext+'   '+s;
            end;
            adoquery1.Close;
            adoquery1.SQL.Clear;
            adoquery1.SQL.Add(sqltext);
            adoquery1.ExecSQL;
         end;
         //ADOConnection1.CommitTrans;
      except
         raise   exception.Create('SQL script dosyası okunurken hata oluştu...');
         //ADOConnection1.RollbackTrans;
      end;
   end;
end;



örnek uygulamanın kodu,"Program Kodu ile tabloları oluşturma" projesinin aynı,sadece tablo oluşturma prosedürü farklıdır:


Kod: Delphi
  1. procedure Tfrmcreatedb.tablo_olustur;
  2. var
  3.    s        :string;
  4.    sqltext  :string;
  5.    sqlfile  :TextFile;
  6. begin
  7.    //text dosyadan sql script ifadelerini alıp tabloları oluşturur
  8.    AssignFile(sqlfile,trim(Edit6.Text));
  9.    FileMode:=0;
  10.    Reset(sqlfile);
  11.    try
  12.       //ADOConnection1.BeginTrans;
  13.       while not eof(sqlfile) do
  14.       begin
  15.          Readln(sqlfile,s);
  16.          sqltext:=s;
  17.          while (not eof(sqlfile)) and (uppercase(trim(s))<>'GO') do
  18.          begin
  19.             Readln(sqlfile,s);
  20.             if (uppercase(trim(s))<>'GO') then
  21.                sqltext:=sqltext+'   '+s;
  22.          end;
  23.          ADOQuery1.Close;
  24.          ADOQuery1.SQL.Clear;
  25.          ADOQuery1.SQL.Add(sqltext);
  26.          ADOQuery1.ExecSQL;
  27.       end;
  28.       //ADOConnection1.CommitTrans;
  29.    except
  30.       raise   exception.Create('SQL script dosyası okunurken hata oluştu...');
  31.       //ADOConnection1.RollbackTrans;
  32.    end;
  33. end;

örnek uygulama ekte.

« Son Düzenleme: 12 Kasım 2007 16:21:09 by Fatih »