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.