Ms Sql Server Veritabanı Bağlantısını Progressbar'da İzleme

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ı
dynamo
Üye
Mesajlar: 96
Kayıt: 21 Haz 2005 02:05
Konum: istanbul

Ms Sql Server Veritabanı Bağlantısını Progressbar'da İzleme

Mesaj gönderen dynamo »

öncelikle sql server veritabanı bağlantısını test etmek için bir fonksiyon oluşturalım:

Kod: Tümünü seç

function IsSQLServerRunning(const server,database,user,password:string): Boolean;
var
  TempConnection: TADOConnection;  //uses ADODB
  TempConnectionString: string;
begin
   result := false;
   try
      CoInitialize(nil);  //uses ActiveX
      try
         TempConnection := TADOConnection.Create(nil);
         TempConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=False;User ID=%s;Password=%s;Initial Catalog=%s;Data Source=%s';
         TempConnection.CommandTimeOut := 4;
         TempConnection.ConnectionTimeOut := 4;
         TempConnection.ConnectionString := Format(TempConnectionString, [user, password, database, server]);
         TempConnection.KeepConnection := false;
         TempConnection.LoginPrompt := false;
         TempConnection.Open;
         result := true;
      except
         result := false;
      end
   finally
      CoUninitialize;
      TempConnection.Close;
      TempConnection.Free;
      TempConnection := nil;
   end;
end;
IsSQLServerRunning fonksiyonu 4 parametre alır.server parametresi bilgisayar adı yada ip no(instance name);database parametresi bağlanılacak veritabanı adı,varsayılan master kullanılır;user parametresi kullanıcı adı,varsayılan sa ;password parametresi kullanıcının şifresi, varsayılan sa'nın şifresi.fonksiyonda connectiontimeout değeri 4 sn olarak belirlendi.

CoInitialize(): Çağrıldığı thread için COM kütüphanesini açar , bir anlamda kaynakları tahsis eder böylece COM fonksiyonlarını çağırabilecek hale gelir.

CoUninitialize():COM threadleri sonlanma aşamasında , COM kütüphanesini kapatmak ve bazı kaynakları geri vermek için bu fonksiyonu çağırmalıdır.


bağlantı testi, thread kullanmadan yapılırsa

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);
begin
   if  IsSQLServerRunning('.','master','sa','123') then
      Label1.Caption:='Bağlantı Sağlandı.'
   else
      Label1.Caption:='Bağlantı Sağlanamadı.....';
   
end;

fonksiyonda kullanılan connectionTimeout süresi kadar form donacaktır.form kilitlenmesini önlemek için aynı zamanda bağlantı süresini progressbar'da izleyebilmek için thread kullanmak gerekir.

normalde tek bir thread oluşturup test yapılabilir:

Kod: Tümünü seç


var
  Form1: TForm1;
  hThr1: THandle;

procedure TForm1.FormCreate(Sender: TObject);
begin
   terminateThread(hThr1, 9999);
end;

procedure Thread1;
var
  i: Integer;
  b1:Boolean;
begin
   b1:=false;
   form1.Label1.Caption:='Bağlanmaya Çalışıyor....';
   if  IsSQLServerRunning('.','master','sa','123') then
      b1:=true
   else
      b1:=false;
   for i := 1 to 100 do
   begin
      form1.ProgressBar1.Position:=i;
      sleep(50);
   end;

   if b1=true then
      form1.Label1.Caption:='Bağlantı Sağlandı.'
   else
      form1.Label1.Caption:='Bağlantı Sağlanamadı.....';

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   Createthread(nil, 0, @Thread1, nil, 0, hThr1);
end;
fakat ADOConnection (eğer sql server bağlantısı yoksa) ConnectionTimeOut'a atanan değer kadar sonra for döngüsü çalışacaktır.bu istenmeyen durumu ortadan kaldırmak için 2 thread kullanıldı.

Resim

Kod: Tümünü seç


var
  Form1: TForm1;
  hThr1, hThr2: THandle;
  bt:Boolean;

procedure TForm1.FormCreate(Sender: TObject);
begin
   terminateThread(hThr1, 9999);
   terminateThread(hThr2, 9999);
end;


procedure Thread1;
var
  i: Integer;
begin
   bt:=false;
   form1.Label1.Caption:='Bağlanmaya Çalışıyor....';
   if  IsSQLServerRunning('.','master','sa','123') then
      bt:=true
   else
      bt:=false;
end; 

procedure Thread2;
var
  i: Integer;
begin
   form1.Button1.Enabled:=false;
   form1.Shape1.Brush.Color:=clWhite;

   for i := 1 to 100 do
   begin
      form1.ProgressBar1.Position:=i;
      sleep(50);
   end;

   if bt=true then
   begin
      form1.Label1.Caption:='Bağlantı Sağlandı.' ;
      form1.Shape1.Brush.Color:=clGreen;
   end
   else
   begin
      form1.Label1.Caption:='Bağlantı Sağlanamadı.....';
      form1.Shape1.Brush.Color:=clRed;
   end;

   form1.Button1.Enabled:=true;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
   Createthread(nil, 0, @Thread1, nil, 0, hThr1);
   Createthread(nil, 0, @Thread2, nil, 0, hThr2);
end;
Thread1 sql server veritabanı bağlantısı,Thread2 for döngüsünü çalıştırır.eğer sql server bağlantısı yoksa ,connectionTimeout süresi (fonksiyonda 4 sn) sonunda bağlantı testi bitmiş global bt değişkenine false değeri atanmış olur.bu arada for döngüsüde (5 sn) bitmiş olacak ve bir alt satırdaki kodları çalıştıracaktır.
Cevapla