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.