Arşiv Anasayfa SQL Server
Sayfalar: 1
Ms Sql Server Veritabanı Bağlantısını Progressbar'da İzleme Gönderen: dynamo Tarih: 02 July 2007 09:32:00
öncelikle sql server veritabanı bağlantısını test etmek için bir fonksiyon oluşturalım:

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

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:

var
 Form1: TForm1;
 hThr1: THandle;
 bt:Boolean;
 
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  terminateThread(hThr1, 9999);
end;
 
 
procedure Thread1;
var
 i: Integer;
 b1:Boolean;
begin
  b1:=false;
  form1.Label1.Caption:='Baglanmaya Calisiyor....';
  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:='Baglanti Saglandi.'
  else
     form1.Label1.Caption:='Baglanti Saglanamadi.....';
 
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ı.




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:='Baglanmaya Calisiyor....';
  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:='Baglanti Saglandi.' ;
     form1.Shape1.Brush.Color:=clGreen;
  end
  else
  begin
     form1.Label1.Caption:='Baglanti Saglanamadi.....';
     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.

örnek uygulama ekte.

Ynt: Ms Sql Server Veritabanı Bağlantısını Progressbar'da İzleme Gönderen: kocaturk Tarih: 02 July 2007 14:15:49
Paylaşım için teşekkürler eline sağlık.