Arşiv Anasayfa SQL Server
Sayfalar: 1
Text/Script Dosyadan Sql Server Veritabanı ve Tablolarını Oluşturma Gönderen: dynamo Tarih: 12 November 2007 15:04:30
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:

//SQL Server bağlantısını kontrol et
function ConnectSqlDatabase(UserName,Password,Server:string):Boolean;
var
  ADOConnection: OleVariant;   //uses ComObj;
begin
  ADOConnection := CreateOleObject('ADODB.Connection');
  ADOConnection.CursorLocation := 3; // User client
  ADOConnection.ConnectionString :='Provider=SQLOLEDB.1;Persist Security Info=False;Data Source='+Server+';User ID='+UserName+';Password='+Password;
  try
     ADOConnection.Open;
     result:= true;
  except
     result:= false;
  end;
end;

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

function GetComputerName: string;
var
  buffer: array[0..MAX_COMPUTERNAME_LENGTH + 1] of Char;
  Size: Cardinal;
begin
  Size := MAX_COMPUTERNAME_LENGTH + 1;
  Windows.GetComputerName(@buffer, Size);
  Result := StrPas(buffer);
end;
 
procedure Tfrmcreatedb.FormShow(Sender: TObject);
begin
  Edit5.Text:= GetComputerName ;
end;

veritabanı oluşturma:

Tfrmcreatedb.CreateSqlDatabase(server,database,user,password,database_dir,str_data_file,str_log_file:string):Boolean;
begin
  result:=false;
 
  //master veritabanına bağlan
  ADOConnection1.Connected :=false;
  ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=false;User ID='+user+';Initial Catalog=master;Password ='+password+';Data Source=' +server;
  ADOConnection1.Connected := true;
  if ADOConnection1.Connected then begin
     ADOQuery1.Close;
     ADOQuery1.SQL.Clear;
     ADOQuery1.SQL.Add('select * from master..sysdatabases WHERE name='''+database+'''');
     ADOQuery1.Open;
     if  ADOQuery1.RecordCount >0 then begin  //veritabanını önceden oluşturulmuş
        ShowMessage('Veritabanı Önceden Oluşturulmuş...');
        exit;
     end
     else begin  //veritabanı yok, seçili dizi altında oluştur
        ADOCommand1.Cancel();
        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 ';
        ADOCommand1.Execute;
 
        //veritabanına bağlan
        ADOConnection1.Connected :=false;
        ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=false;User ID='+user+';Initial Catalog='+database+';Password ='+password+';Data Source=' +server;
        ADOConnection1.Connected := true;
        if ADOConnection1.Connected then begin
           //tabloları oluştur
           tablo_olustur;
           result:=true;
        end;
     end;
  end;
end;

tabloları oluşturma:
   
:
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:

procedure Tfrmcreatedb.BitBtn3Click(Sender: TObject);
begin
  if Edit1.Text='' then begin
     showmessage('Veritabanı Adını Giriniz....');
     Edit1.SetFocus;
     exit;
  end;
 
  if Edit2.Text='' then begin
     showmessage('Veritabanı Yolunu Giriniz....');
     Edit2.SetFocus;
     exit;
  end;
 
  user:=trim(Edit3.Text);
  password:=trim(Edit4.Text);
  server:= trim(Edit5.Text);
 
  database:= trim(Edit1.Text);
  database_dir:=trim(Edit2.Text)+'\';
  str_data_file:= database_dir+database+'_data.mdf' ;
  str_log_file:=  database_dir+database+'_log.mdf'  ;
 
  //sql server bağlantısını kontrol et
  if ConnectSqlDatabase(user,password,server)=false then begin
     Application.MessageBox('Sql server çalışmıyor...Servisini çalıştırdıktan sonra programı açınız...','sql server bağlantı hatası',MB_OK);
     exit;
  end;
 
  //sql servere veritabanı oluştur
  if CreateSqlDatabase(server,database,user,password,database_dir,str_data_file,str_log_file) then
     showmessage('Veritabanı ve Tabloları Oluşturuldu....')
  else
     showmessage('Hata....Veritabanı Oluşturulamadı........');
 
end;

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

procedure Tfrmcreatedb.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
  case Key of
     VK_F11: begin
           if Application.MessageBox('Veritabanı Silinsin mi...?','UYARI',MB_YESNO)=ID_NO then exit;
              user:=trim(Edit3.Text);
              password:=trim(Edit4.Text);
              server:= trim(Edit5.Text);
              database:= trim(Edit1.Text);
 
              Screen.Cursor:=crHourGlass;
              try
                 ADOConnection1.Connected :=false;
                 ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=false;User ID='+user+';Initial Catalog=master;Password ='+password+';Data Source=' +server;
                 ADOConnection1.Connected := true;
                 if (ADOConnection1.Connected) then begin
                    try
                       ADOCommand1.Cancel;
                       ADOCommand1.CommandText:= 'USE master IF EXISTS(SELECT * FROM master..sysdatabases where name='''+database+''') DROP DATABASE '+database;
                       ADOCommand1.Execute;
                       showmessage('Veritabanı Silindi');
                    except
                       showmessage('Hata...Veritabanı Silinemedi....');
                    end;
                 end;
              finally
                 Screen.Cursor:=crDefault;
              end;
           end;
  end;
end;





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

dosyadaki tablo oluşturma sql ifadeleri:

IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[stok_table]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
CREATE TABLE  [stok_table] (
Kod       VARCHAR (10) ,
Adi        VARCHAR (30) ,
Unvani     VARCHAR (50) ,
Birim  VARCHAR ( 10) ,
BirimCarpan  FLOAT ,
DepoKodu       VARCHAR (10) ,
GrupKodu VARCHAR (10) ,
GirenMiktar     FLOAT ,
CikanMiktar     FLOAT ,
KalanMiktar     FLOAT,
BirimFiyati     MONEY,
Tarih           DATETIME,
PRIMARY KEY     (Kod) )
 
GO
 
IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[sthr_table]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
CREATE TABLE  [sthr_table] (
Sira            BIGINT IDENTITY(1,1) NOT NULL ,
EvrakTarihi     DATETIME ,
EvrakNo         VARCHAR ( 20) ,
StokKodu        VARCHAR ( 10) ,
StokAdi         VARCHAR ( 30) ,
Aciklama        VARCHAR ( 60) ,
Birim           VARCHAR ( 10) ,
BirimFiyati     MONEY ,
KdvOrani        INT ,
FaturaNo        VARCHAR ( 10) ,
KayitTarihi     DATETIME,
PRIMARY KEY   (Sira,EvrakTarihi,EvrakNo,StokKodu) )
 
GO
 
IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[fatura_table]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
CREATE TABLE  [fatura_table] (
FaturaNo        VARCHAR ( 10) ,
MusteriKodu     VARCHAR ( 10) ,
StokKodu        VARCHAR ( 10) ,
Aciklama        VARCHAR ( 60) ,
Birim           VARCHAR ( 10) ,
BirimFiyati     MONEY ,
StokMiktari     FLOAT ,
VadeTarihi      DATETIME ,
TahsilTarihi    DATETIME ,
KayitTarihi     DATETIME ,
PRIMARY KEY   (FaturaNo) )
 

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).

:
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:


procedure Tfrmcreatedb.tablo_olustur;
var
  s        :string;
  sqltext  :string;
  sqlfile  :TextFile;
begin
  //text dosyadan sql script ifadelerini alıp tabloları oluşturur
  AssignFile(sqlfile,trim(Edit6.Text));
  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;

örnek uygulama ekte.