MSSQLSERVER servisinin çalışıp çalışmadığını nasıl anlarız
- pasa_yasar
- Üye
- Mesajlar: 570
- Kayıt: 07 Haz 2004 12:35
dediğin gibi olmuyor. SQL SERVER kendi management programı bile o SQL SERVER i durdurduğum zaman bağlanmıyor. Delphi 7 kullanıyorum.
[img][img]http://www.uploadtr.net/thumbs/333700sql.JPG[/img] [/img]
şekilde gibi. bunu MSDE kurmadan SQL SERVER 2005 Express nasıl başlatabiliriz. Daha önce hiç ayarlayan oldumu acaba. Firma tercihinden dolayı MS SQL kullanmak zorundayım
[img][img]http://www.uploadtr.net/thumbs/333700sql.JPG[/img] [/img]
şekilde gibi. bunu MSDE kurmadan SQL SERVER 2005 Express nasıl başlatabiliriz. Daha önce hiç ayarlayan oldumu acaba. Firma tercihinden dolayı MS SQL kullanmak zorundayım
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
Servisin durumunu okumak (GetServiceStatus), servisi durdurmak (StopNTService) ve servisi çalıştırmak (StartNTService) için 3 fonksiyon. Eğer tüm mesele bu ise bu fonksiyonlar sana yardımcı olacaktır.
Örnek:
farklı sql'in kontrolüne örnek: hatta bu SQL hizmetini çalıştıralım: Aslında bu hizmetin görüntü adı her ne kadar SQL Server (SQLEXPRESS) ise de hizmetin kullanılacak ismi MSSQL$SQLEXPRESS tir. Zaten dynamo da konudan bahsetmiş. Sorun hizmeti durdurup açınca ortaya çıkan bağlantı hatası ise bu durumda tüm ADO bağlantılarını kapatıp açarak tazelemen gerekebilir. İyi çalışmalar.
Not:Konunun açılış maksadı da farklı instancename'ler yüzünden onlara müdahele edilememsiydi. MS işi olsa da (bence süper bir mantık) bir birinden bağımsız bir çok SQL Server aynı sistemde birden fazla çalışıyor. Sadece normal SQL'in hizmet adı 'MSSQLSERVER' farklı instancename'e sahip SQL hizmetinin adı ise 'MSSQL$'+InstanceName şeklinde elde ediliyor.
Kod: Tümünü seç
function GetServiceStatus(const ServiceName: string): SERVICE_STATUS;
const SQLHata='SQL Server';
var
SCM: SC_HANDLE;
ServiceHandle: SC_HANDLE;
begin
SCM := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if SCM = 0 then
raise SQLException.CreateFmt('%s Yüklenmemiş',[SQLHata]);
ServiceHandle := OpenService(SCM, PChar(ServiceName), SERVICE_ALL_ACCESS);
if ServiceHandle = 0 then begin
CloseServiceHandle(SCM);
case GetLastError of
ERROR_ACCESS_DENIED: raise SQLException.CreateFmt('%s Yetersiz ayrıcalıklar',[SQLHata]);
ERROR_INVALID_HANDLE: raise SQLException.CreateFmt('%s Geçersiz Handle',[SQLHata]);
ERROR_INVALID_NAME:raise SQLException.CreateFmt('%s Servis Bulunamadı',[SQLHata]);
ERROR_SERVICE_DOES_NOT_EXIST: raise SQLException.CreateFmt('%s Servis bulunamadı',[SQLHata]);
end;
end;
//SeciliServis.ServiceStatus.dwCurrentState - SERVICE_STOPPED
if not QueryServiceStatus(ServiceHandle, Result) then
raise SQLException.Create('Durum Alınamadı');
end;
function StopNTService(const ServiceName: string): Boolean;
var
SCM: SC_HANDLE;
ServiceHandle: SC_HANDLE;
Res: Boolean;
Status: SERVICE_STATUS;
begin
Result := False;
SCM := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if SCM = 0 then
raise Exception.Create('Servis Kontrol Yöneticisi açılamadı');
ServiceHandle := OpenService(SCM, PChar(ServiceName), SERVICE_ALL_ACCESS);
if ServiceHandle = 0 then
begin
CloseServiceHandle(SCM);
raise Exception.Create(ServiceName + ' isimli servis açılamadı. Hata: ' + SysErrorMessage(getLastError));
end;
Res := ControlService(ServiceHandle, SERVICE_CONTROL_STOP, Status);
if not Res then
begin
if GetLastError <> ERROR_SERVICE_NOT_ACTIVE then
raise Exception.Create('Servis durdurulamadı');
end else Result := True;
end;
// servis başlatma fonksiyonumuz
function StartNTService(const ServiceName: string): Boolean;
var
SCM: SC_HANDLE;
ServiceHandle: SC_HANDLE;
Res: Boolean;
Temp: PChar;
Status: SERVICE_STATUS;
Err: Integer;
begin
Result := False;
SCM := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if SCM = 0 then
raise Exception.Create('Servis Kontrol Yöneticisi açılamadı. Hata: ' + SysErrorMessage(getLastError));
ServiceHandle := OpenService(SCM, PChar(ServiceName), SERVICE_ALL_ACCESS);
if ServiceHandle = 0 then
begin
CloseServiceHandle(SCM);
raise Exception.Create(ServiceName + ' isimli servis açılamadı. Hata: ' + SysErrorMessage(getLastError));
end;
Res := StartService(ServiceHandle, 0, Temp);
if Res then
begin
Res := QueryServiceStatus(ServiceHandle, Status);
while (Res) do
begin
if Status.dwCurrentState = SERVICE_RUNNING then
begin
Result := True;
Break;
end else if Status.dwCurrentState = SERVICE_STOPPED then
begin
Result := False;
Break;
end;
QueryServiceStatus(ServiceHandle, Status);
end;
end else begin
Err := GetLastError;
if Err <> ERROR_SERVICE_ALREADY_RUNNING then
raise Exception.Create(ServiceName + ' isimli servis başlatılamadı. Hata:' + SysErrorMessage(Err));
end;
CloseServiceHandle(SCM);
if not Result then
raise Exception.Create(ServiceName + ' isimli servis başlatılamadı');
end;
Kod: Tümünü seç
if GetServiceStatus('MSSQLSERVER').dwCurrentState=SERVICE_RUNNING then ShowMessage('SQL Server Açık');
Kod: Tümünü seç
if GetServiceStatus('MSSQL$SQLEXPRESS').dwCurrentState=SERVICE_RUNNING then ShowMessage('SQL Server Açık');
Kod: Tümünü seç
StartNTService('MSSQL$SQLEXPRESS');
Not:Konunun açılış maksadı da farklı instancename'ler yüzünden onlara müdahele edilememsiydi. MS işi olsa da (bence süper bir mantık) bir birinden bağımsız bir çok SQL Server aynı sistemde birden fazla çalışıyor. Sadece normal SQL'in hizmet adı 'MSSQLSERVER' farklı instancename'e sahip SQL hizmetinin adı ise 'MSSQL$'+InstanceName şeklinde elde ediliyor.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
- pasa_yasar
- Üye
- Mesajlar: 570
- Kayıt: 07 Haz 2004 12:35
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
Kod: Tümünü seç
uses Windows, SysUtils, WinSvc;

Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
- pasa_yasar
- Üye
- Mesajlar: 570
- Kayıt: 07 Haz 2004 12:35
dediğin unit zaten bende tanımlı. yinede hata verdi. hepsini okudum için rahat olsun birşey öğrenmek istediğimde de yeterince forumda diğer delphi forumlarında araştırma yapıyorum. bu verdiğin işlem birçok kere SQL 2005 Express de işe yaramıyor bunu da ifade edeyim. tecrüblerden emin olmak istiyorum o kadar. sonuçta bir program sadece bir iki kere doğru çalıştı diye tamamdır diyemezsin
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
dynamo'nun verdiği şekilde bu uniti baştan yazdım ve yine dynamo'nun dediği gibidynamo yazdı:Kod: Tümünü seç
unit Services; interface uses classes, // TStrings windows, //DWORD WinSvc, // TEnumServiceStatus SysUtils; //StrPas const cnMaxServices = 4096; SERVICE_KERNEL_DRIVER = $00000001; SERVICE_FILE_SYSTEM_DRIVER = $00000002; SERVICE_ADAPTER = $00000004; SERVICE_RECOGNIZER_DRIVER = $00000008; SERVICE_DRIVER = (SERVICE_KERNEL_DRIVER or SERVICE_FILE_SYSTEM_DRIVER or SERVICE_RECOGNIZER_DRIVER); SERVICE_WIN32_OWN_PROCESS = $00000010; SERVICE_WIN32_SHARE_PROCESS = $00000020; SERVICE_WIN32 = (SERVICE_WIN32_OWN_PROCESS or SERVICE_WIN32_SHARE_PROCESS); SERVICE_INTERACTIVE_PROCESS = $00000100; SERVICE_TYPE_ALL = (SERVICE_WIN32 or SERVICE_ADAPTER or SERVICE_DRIVER or SERVICE_INTERACTIVE_PROCESS); type TSvcA = array[0..cnMaxServices] of TEnumServiceStatus; PSvcA = ^TSvcA; function ServiceGetList(slServicesList: TStrings; sMachine: string = ''; dwServiceType: DWORD = SERVICE_WIN32; dwServiceState: DWord = SERVICE_STATE_ALL): Boolean; //------------------------------------- // Gets a list of services // // return TRUE if successful // // sMachine: // machine name, ie: \\SERVER // empty = local machine // // dwServiceType // SERVICE_WIN32, // SERVICE_DRIVER or // SERVICE_TYPE_ALL // // dwServiceState // SERVICE_ACTIVE, // SERVICE_INACTIVE or // SERVICE_STATE_ALL // // slServicesList // TStrings variable to storage // //------------------------------------- function ServiceGetStatus(sMachine, sService: string): Integer; //------------------------------------- // get service status // // return status code if successful // -1 if not // // return codes: // SERVICE_STOPPED // SERVICE_RUNNING // SERVICE_PAUSED // // following return codes // are used to indicate that // the service is in the // middle of getting to one // of the above states: // SERVICE_START_PENDING // SERVICE_STOP_PENDING // SERVICE_CONTINUE_PENDING // SERVICE_PAUSE_PENDING // // sMachine: // machine name, ie: \\SERVER // empty = local machine // // sService // service name, ie: Alerter //------------------------------------- function ServiceRunning(sMachine, sService: string): Boolean; //------------------------------------- // return TRUE if the specified // service is running, defined by // the status code SERVICE_RUNNING. // return FALSE if the service // is in any other state, including // any pending states //------------------------------------- function ServiceStart(sMachine, sService: string): Boolean; //------------------------------------- // start service // // return TRUE if successful // // sMachine: // machine name, ie: \\SERVER // empty = local machine // // sService // service name, ie: Alerter //------------------------------------- function ServiceStop(sMachine, sService: string): Boolean; //------------------------------------- // stop service // // return TRUE if successful // // sMachine: // machine name, ie: \\SERVER // empty = local machine // // sService // service name, ie: Alerter //------------------------------------- function ServiceStopped(sMachine, sService: string): Boolean; //------------------------------------- // return TRUE if the specified // service was stopped, defined by // the status code SERVICE_STOPPED. //------------------------------------- implementation function ServiceGetList(slServicesList: TStrings; sMachine: string = ''; dwServiceType: DWORD = SERVICE_WIN32; dwServiceState: DWord = SERVICE_STATE_ALL): Boolean; var j: Integer; schm: SC_Handle; ssa: PSvcA; nBytesNeeded, nServices, nResumeHandle: DWord; begin Result := False; schm := OpenSCManager(pChar(sMachine), nil, SC_MANAGER_ALL_ACCESS); // connect to the service control manager if (schm > 0) then // if successful... begin nResumeHandle := 0; New(ssa); EnumServicesStatus(schm, dwServiceType, dwServiceState, ssa^[0], SizeOf(ssa^), nBytesNeeded, nServices, nResumeHandle); // Assume that our initial array was large enough to hold all entries. add code to enumerate if necessary. for j := 0 to nServices - 1 do slServicesList.Add(StrPas(ssa^[j].lpDisplayName)); Result := True; Dispose(ssa); CloseServiceHandle(schm); // close service control manager handle end; end; function ServiceGetStatus(sMachine, sService: string): Integer; var schm, schs: SC_Handle; ss: TServiceStatus; dwStat: Integer; begin dwStat := -1; schm := OpenSCManager(pChar(sMachine), nil, SC_MANAGER_CONNECT); if (schm > 0) then // if successful... begin schs := OpenService(schm, pChar(sService), SERVICE_QUERY_STATUS); if (schs > 0) then // if successful... if (QueryServiceStatus(schs, ss)) then dwStat := ss.dwCurrentState; CloseServiceHandle(schs); CloseServiceHandle(schm); end; Result := dwStat; end; function ServiceRunning(sMachine, sService: string): Boolean; begin Result := SERVICE_RUNNING = ServiceGetStatus(sMachine, sService); end; function ServiceStopped(sMachine, sService: string): Boolean; begin Result := SERVICE_STOPPED = ServiceGetStatus(sMachine, sService); end; function ServiceStart(sMachine, sService: string): Boolean; var schm, schs: SC_Handle; ss: TServiceStatus; psTemp: pChar; dwChkP: DWord; begin ss.dwCurrentState := 0; schm := OpenSCManager(pChar(sMachine), nil, SC_MANAGER_CONNECT); if (schm > 0) then // if successful... begin schs := OpenService(schm, pChar(sService), SERVICE_START or SERVICE_QUERY_STATUS); if (schs > 0) then // if successful... begin psTemp := nil; if (StartService(schs, 0, psTemp)) then begin if (QueryServiceStatus(schs, ss)) then begin while (SERVICE_RUNNING <> ss.dwCurrentState) do begin dwChkP := ss.dwCheckPoint; SleepEx(ss.dwWaitHint, False); if (not QueryServiceStatus(schs, ss)) then break; if (ss.dwCheckPoint < dwChkP) then break; end; end; end; CloseServiceHandle(schs); end; CloseServiceHandle(schm); end; Result := SERVICE_RUNNING = ss.dwCurrentState; end; function ServiceStop(sMachine, sService: string): Boolean; var schm, schs: SC_Handle; ss: TServiceStatus; dwChkP: DWord; begin schm := OpenSCManager(pChar(sMachine), nil, SC_MANAGER_CONNECT); if (schm > 0) then // if successful... begin schs := OpenService(schm, pChar(sService), SERVICE_STOP or SERVICE_QUERY_STATUS); if (schs > 0) then // if successful... begin if (ControlService(schs, SERVICE_CONTROL_STOP, ss)) then begin if (QueryServiceStatus(schs, ss)) then begin while (SERVICE_STOPPED <> ss.dwCurrentState) do begin dwChkP := ss.dwCheckPoint; SleepEx(ss.dwWaitHint, False); if (not QueryServiceStatus(schs, ss)) then break; if (ss.dwCheckPoint < dwChkP) then break; end; end; end; CloseServiceHandle(schs); end; CloseServiceHandle(schm); end; Result := SERVICE_STOPPED = ss.dwCurrentState; end; end.
Kod: Tümünü seç
ServiceStart('','MSSQL$SQLEXPRESS');
Kod: Tümünü seç
ServiceStop('','MSSQL$SQLEXPRESS');
Not:Sistemimdeki SQLEXPRESS'im SQL 2005'in ücretsiz sürümü olan MSDE karşılığı.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
- pasa_yasar
- Üye
- Mesajlar: 570
- Kayıt: 07 Haz 2004 12:35
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
-
- Üye
- Mesajlar: 25
- Kayıt: 04 Ara 2010 12:34
Re:
Konu eskiymiş baya ama en azından teşekkürlerimi iletmek için hortlatmış oldum konuyusabanakman yazdı:Servisin durumunu okumak (GetServiceStatus), servisi durdurmak (StopNTService) ve servisi çalıştırmak (StartNTService) için 3 fonksiyon. Eğer tüm mesele bu ise bu fonksiyonlar sana yardımcı olacaktır.Örnek:Kod: Tümünü seç
function GetServiceStatus(const ServiceName: string): SERVICE_STATUS; const SQLHata='SQL Server'; var SCM: SC_HANDLE; ServiceHandle: SC_HANDLE; begin SCM := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); if SCM = 0 then raise SQLException.CreateFmt('%s Yüklenmemiş',[SQLHata]); ServiceHandle := OpenService(SCM, PChar(ServiceName), SERVICE_ALL_ACCESS); if ServiceHandle = 0 then begin CloseServiceHandle(SCM); case GetLastError of ERROR_ACCESS_DENIED: raise SQLException.CreateFmt('%s Yetersiz ayrıcalıklar',[SQLHata]); ERROR_INVALID_HANDLE: raise SQLException.CreateFmt('%s Geçersiz Handle',[SQLHata]); ERROR_INVALID_NAME:raise SQLException.CreateFmt('%s Servis Bulunamadı',[SQLHata]); ERROR_SERVICE_DOES_NOT_EXIST: raise SQLException.CreateFmt('%s Servis bulunamadı',[SQLHata]); end; end; //SeciliServis.ServiceStatus.dwCurrentState - SERVICE_STOPPED if not QueryServiceStatus(ServiceHandle, Result) then raise SQLException.Create('Durum Alınamadı'); end; function StopNTService(const ServiceName: string): Boolean; var SCM: SC_HANDLE; ServiceHandle: SC_HANDLE; Res: Boolean; Status: SERVICE_STATUS; begin Result := False; SCM := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); if SCM = 0 then raise Exception.Create('Servis Kontrol Yöneticisi açılamadı'); ServiceHandle := OpenService(SCM, PChar(ServiceName), SERVICE_ALL_ACCESS); if ServiceHandle = 0 then begin CloseServiceHandle(SCM); raise Exception.Create(ServiceName + ' isimli servis açılamadı. Hata: ' + SysErrorMessage(getLastError)); end; Res := ControlService(ServiceHandle, SERVICE_CONTROL_STOP, Status); if not Res then begin if GetLastError <> ERROR_SERVICE_NOT_ACTIVE then raise Exception.Create('Servis durdurulamadı'); end else Result := True; end; // servis başlatma fonksiyonumuz function StartNTService(const ServiceName: string): Boolean; var SCM: SC_HANDLE; ServiceHandle: SC_HANDLE; Res: Boolean; Temp: PChar; Status: SERVICE_STATUS; Err: Integer; begin Result := False; SCM := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); if SCM = 0 then raise Exception.Create('Servis Kontrol Yöneticisi açılamadı. Hata: ' + SysErrorMessage(getLastError)); ServiceHandle := OpenService(SCM, PChar(ServiceName), SERVICE_ALL_ACCESS); if ServiceHandle = 0 then begin CloseServiceHandle(SCM); raise Exception.Create(ServiceName + ' isimli servis açılamadı. Hata: ' + SysErrorMessage(getLastError)); end; Res := StartService(ServiceHandle, 0, Temp); if Res then begin Res := QueryServiceStatus(ServiceHandle, Status); while (Res) do begin if Status.dwCurrentState = SERVICE_RUNNING then begin Result := True; Break; end else if Status.dwCurrentState = SERVICE_STOPPED then begin Result := False; Break; end; QueryServiceStatus(ServiceHandle, Status); end; end else begin Err := GetLastError; if Err <> ERROR_SERVICE_ALREADY_RUNNING then raise Exception.Create(ServiceName + ' isimli servis başlatılamadı. Hata:' + SysErrorMessage(Err)); end; CloseServiceHandle(SCM); if not Result then raise Exception.Create(ServiceName + ' isimli servis başlatılamadı'); end;
farklı sql'in kontrolüne örnek:Kod: Tümünü seç
if GetServiceStatus('MSSQLSERVER').dwCurrentState=SERVICE_RUNNING then ShowMessage('SQL Server Açık');
hatta bu SQL hizmetini çalıştıralım:Kod: Tümünü seç
if GetServiceStatus('MSSQL$SQLEXPRESS').dwCurrentState=SERVICE_RUNNING then ShowMessage('SQL Server Açık');
Aslında bu hizmetin görüntü adı her ne kadar SQL Server (SQLEXPRESS) ise de hizmetin kullanılacak ismi MSSQL$SQLEXPRESS tir. Zaten dynamo da konudan bahsetmiş. Sorun hizmeti durdurup açınca ortaya çıkan bağlantı hatası ise bu durumda tüm ADO bağlantılarını kapatıp açarak tazelemen gerekebilir. İyi çalışmalar.Kod: Tümünü seç
StartNTService('MSSQL$SQLEXPRESS');
Not:Konunun açılış maksadı da farklı instancename'ler yüzünden onlara müdahele edilememsiydi. MS işi olsa da (bence süper bir mantık) bir birinden bağımsız bir çok SQL Server aynı sistemde birden fazla çalışıyor. Sadece normal SQL'in hizmet adı 'MSSQLSERVER' farklı instancename'e sahip SQL hizmetinin adı ise 'MSSQL$'+InstanceName şeklinde elde ediliyor.


Re: MSSQLSERVER servisinin çalışıp çalışmadığını nasıl anlar
Hocam bütün herşey birbiri içine girmiş ben aynı şekilde şöyle yapmak istiyorum,
combobox da sql server name lerini alacak ve ordan ise combobox 2 de seçilen hangisi ise combobox da database leri gelecek ve onu seçeceğim ve sonra ise;
form2 açılacak. ve ordan ise combobox veya listbox yardımı ile database içindeki verileri çekeceğim.? tb leri combobox veya listbox çekeceğim...
Adoconnection vs onları kullanmayı bilmiyorum:(
VeSSeLaM.
combobox da sql server name lerini alacak ve ordan ise combobox 2 de seçilen hangisi ise combobox da database leri gelecek ve onu seçeceğim ve sonra ise;
form2 açılacak. ve ordan ise combobox veya listbox yardımı ile database içindeki verileri çekeceğim.? tb leri combobox veya listbox çekeceğim...
Adoconnection vs onları kullanmayı bilmiyorum:(
VeSSeLaM.
En iyi Sistem fişi çekilmiş Sistem'dir.
Cyber-Warrior.org/K@R@GLU
Cyber-Warrior.org/K@R@GLU
Re: MSSQLSERVER servisinin çalışıp çalışmadığını nasıl anlar
arkadaşlar merhaba konu çok eski ama ben bu winsrvc unitini projemde nasıl kullanabilecem ricam etsem anlatabilirmisiniz 

Soru Sorarken yazmaya Üşenmeyen Parmaklar Sorunun Çözüldükten Sonra Teşekkür etmeye de Üşenmesin.