Arşiv Anasayfa SQL Server
Sayfalar: 1
MS SQL Server'e ADOConnection ile Bağlantı Gönderen: dynamo Tarih: 28 May 2007 08:51:51
"Microsoft OLE DB Provider for SQL Server" (SQLOLEDB.1) sağlayıcısını kullanarak ADOConnection ile MS SQL Server veritabanına bağlantı işlemi.

Veritabanın adı STOKDB olsun.Programın çalıştırıldığında ana formun Create olayında DB_Connect prosedürünün yaptığı işlemler:

1-MS SQL Server'ü kontrol eder.SQL Server yülü ve servis çalışıyorsa programı açar.yoksa hata mesajını verip programı sonlandırır.
2-exe'nin çalıştığı yerde DATA klasörü var mı kontrol eder, yoksa DATA klasörünü oluştur.
3-DATA klasörü varsa,bu klasörün içinde veritabanın dosyaları oluşturulmuş mu,yoksa "create database " sql ifadesi ile veritabanı dosyalarını oluşturur ve veritabanını register eder.
4-veritabanı dosyaları varsa, register edilip edilmediğini kontrol eder,edilmemişse "sp_attach_db" ile register eder.
5-veritabanı register edilmişse tabloları kontrol eder.olmayan tabloları "Tablo_Olustur" prosedürü ile oluşturur.

Giriş formunun OnCreate olayında DB_Connect prosedürü var:

:
procedure TfrmGiris.FormCreate(Sender: TObject);
begin
   DB_Connect;
end;

:
procedure TfrmGiris.DB_Connect;
var
    IniDosya: TIniFile;
    str_dir,str_file_path,str_file:string;
    exe_path:string;
begin
   IniDosya := TIniFile.Create(ExtractFilePath(Application.ExeName)+'Settings.ini');
   try
      server:=IniDosya.ReadString('Database','Server','');
      sapassword:=IniDosya.ReadString('Database','SaPassword','');
   finally
      IniDosya.Free;
   end;

   //-------------SQL Serverün çalışıp çalışmadığını kontrol et-----------------
   if IsSQLServerRunning(GetComputerName,'master','') then
   begin
      next;
   end
   else
   begin
      Application.MessageBox('SQL Server kurulu değil yada Servis Çalışmıyor....Program Sonlandırılacak.....','UYARI',MB_OK);
      Application.Terminate;
      Abort;
   end;

   exe_path:=ExtractFilePath(Application.ExeName);
   //--------------database yoksa database oluştur------------------------------
   ADOConnection1.Connected :=false;
   ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=false;User ID=sa;Initial Catalog=master;Password ='+sapassword+';Data Source=' +server;
   ADOConnection1.Connected := true;
   if  (ADOConnection1.Connected) then begin
      str_dir := exe_path+'DATA';
      str_file_path := exe_path+'DATA\STOKDB'  ;
      str_file:= exe_path+'DATA\STOKDB_data.mdf'  ;

      if not DirectoryExists(str_dir) then
      begin
         ForceDirectories(str_dir);
         if  ( not FileExists(str_file)) then
         begin
            ADOCommand1.Cancel();
            ADOCommand1.CommandText:='CREATE DATABASE [STOKDB]  ON (NAME = ''STOKDB_data'', FILENAME = '''+str_file_path+ '_data.mdf''  ) LOG ON (NAME = ''STOKDB_log'', FILENAME = '''+ str_file_path+ '_log.ldf''  ) COLLATE Turkish_CI_AS ';
            ADOCommand1.Execute;
         end;
      end
      else
      begin
         if  ( not FileExists(str_file)) then
         begin  //database yok oluştur
            ADOCommand1.Cancel();
            ADOCommand1.CommandText:='CREATE DATABASE [STOKDB]  ON (NAME = ''STOKDB_data'', FILENAME = '''+str_file_path+ '_data.mdf''  ) LOG ON (NAME = ''STOKDB_log'', FILENAME = '''+ str_file_path+ '_log.ldf'' ) COLLATE Turkish_CI_AS ';
            ADOCommand1.Execute;
         end
         else
         begin   //database varsa register edilip edilmediğini kotrol et
            ADOConnection1.Connected:=False;
            ADOConnection1.ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=false;User ID=sa;Initial Catalog=master;Password ='+sapassword+';Data Source=' +server;
            ADOConnection1.Connected:=True;

            ADOQuery1.Close;
            ADOQuery1.SQL.Clear;
            ADOQuery1.SQL.Add('select * from master..sysdatabases WHERE name = ''STOKDB'' ');
            ADOQuery1.Open;
            if  ADOQuery1.RecordCount = 0 then
            begin
               str_data:=exe_path+'DATA\STOKDB_data.mdf'  ;
               str_log:=exe_path+'DATA\STOKDB_log.ldf'  ;

               ADOQuery1.Close;
               ADOQuery1.SQL.Clear;
               ADOQuery1.SQL.Text:='EXEC sp_attach_db @dbname = N''STOKDB'',@filename1 =N'''+str_data+''',@filename2 = N'''+str_log+''' ';
               ADOQuery1.ExecSQL;
            end;
         end;
      end;
   end;
   //-------------database varsa tablo kontrolu --------------------------------
   ADOConnection1.Connected :=false;
   ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=false;User ID=sa;Initial Catalog=STOKDB;Password ='+sapassword+';Data Source=' +server;
   ADOConnection1.Connected := true;
   if  (ADOConnection1.Connected) then
   begin
      Tablo_Olustur;
   end;

end;

Settings.ini dosyası:

:
[Database]
Server=127.0.0.1
SaPassword=123

ini dosyadan server adı ve sa şifresi değişkenlere alınır. IsSQLServerRunning  fonksiyonu ile SQL Serverün çalışıp çalışmadığını kontrol edilir.

tabloları oluşturma:

:
procedure TfrmGiris.Tablo_Olustur;
var
   SQL:string;
begin
   //------------------TABLOLARI OLUŞTUR----------------------------------
   //---------------------------------------------------------------------
   SQL:='';
   SQL:=SQL+' IF NOT EXISTS (select * from dbo.sysobjects where id = object_id(N''[dbo].[KULLANICI]'') and OBJECTPROPERTY(id, N''IsUserTable'') = 1)';
   SQL:=SQL+' CREATE TABLE  [KULLANICI] ( ';
   SQL:=SQL+' Kullanici          VARCHAR ( 10) ,';
   SQL:=SQL+' Sifre                 VARCHAR ( 10) ,';
   SQL:=SQL+' PersonelKod           VARCHAR ( 20) ,';
   SQL:=SQL+' PRIMARY KEY   (Kullanici) )';
   ADOCommand1.Cancel();
   ADOCommand1.CommandText:=SQL;
   ADOCommand1.Execute;
   //---------------------------------------------------------------------
   SQL:='';
   SQL:=SQL+' IF NOT EXISTS (select * from dbo.sysobjects where id = object_id(N''[dbo].[PERSONEL]'') and OBJECTPROPERTY(id, N''IsUserTable'') = 1)';
   SQL:=SQL+' CREATE TABLE  [PERSONEL] ( ';
   SQL:=SQL+' KOD          VARCHAR ( 20) ,';
   SQL:=SQL+' AD           VARCHAR ( 50) ,';
   SQL:=SQL+' ADRES        VARCHAR ( 50) ,';
   SQL:=SQL+' IL           VARCHAR ( 20) ,';
   SQL:=SQL+' ILCE         VARCHAR ( 20) ,';
   SQL:=SQL+' TEL          VARCHAR ( 16) ,';
   SQL:=SQL+' KAYITNO      INT ,';
   SQL:=SQL+' KIMLIKNO     VARCHAR ( 20) ,';
   SQL:=SQL+' KAYITTARIHI  DATETIME,';
   SQL:=SQL+' PRIMARY KEY   (KOD) )';
   ADOCommand1.Cancel();
   ADOCommand1.CommandText:=SQL;
   ADOCommand1.Execute;
   //---------------------INDEXLERI OLUŞTUR-------------------------------
   //---------------------------------------------------------------------
   ADOCommand1.Cancel;
   ADOCommand1.CommandText:='if not exists ( select * from dbo.sysindexes where name = ''personel_ix'') CREATE INDEX [personel_ix] ON [dbo].[PERSONEL]([KAYITNO],[KAYITTARIHI]) ON [PRIMARY]';
   ADOCommand1.Execute;

   //------------------DEFAULT DEĞERLERİ YÜKLE----------------------------
   //---------------------------------------------------------------------
   ADOQuery1.Close();
   ADOQuery1.SQL.Clear();
   ADOQuery1.SQL.LoadFromFile(ExtractFilePath(Application.ExeName)+'sql.sql');
   ADOQuery1.ExecSQL;
   //----------------------------------------------------------------------
end;

programın giriş formu:



Tamam Butonu:

:
procedure TfrmGiris.BitBtn1Click(Sender: TObject);
begin
   ADOConnection1.Connected :=false;
   ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=false;User ID=sa;Initial Catalog=STOKDB;Password ='+sapassword+';Data Source=' +server;
   ADOConnection1.Connected := true;
   ADOQuery1.Close;
   ADOQuery1.SQL.Clear;
   ADOQuery1.SQL.Add('select * from KULLANICI WHERE Kullanici = '''+trim(Edit1.Text)+''' and Sifre='''+trim(Edit2.Text)+'''');
   ADOQuery1.Open;
   if ADOQuery1.RecordCount>0 then
   begin
      frmAnaMenu.Show;
   end
   else
   begin
      Application.MessageBox('Kullanıcı Adı yada Şifre Yanlış....','UYARI',MB_OK);
      Edit1.SetFocus;
      exit;
   end;
end;

örnek uygulama ekte

Ynt: MS SQL Server'e ADOConnection ile Bağlantı Gönderen: alperaspirin Tarih: 25 April 2008 10:22:28
"örnek uygulama ekte" imiş ben bulamadım bu eki ?