PDA

View Full Version : چطور میشه SQL SERVER MANAGER رو در دلفی STOP یا START کرد.



mskm100
پنج شنبه 08 شهریور 1386, 01:06 صبح
چطور میشه SQL SERVER MANAGER رو در دلفی STOP یا START کرد.

vcldeveloper
پنج شنبه 08 شهریور 1386, 04:28 صبح
مثل سایر Service ها ویندوز. نحوه Start و Stop کردن سرویس های ویندوز قبلا توضیح داده شده. جستجو بکنید، پیدا می کنید.

موفق باشید

mskm100
جمعه 09 شهریور 1386, 02:16 صبح
آقای کشاورز از راهنمایی شما ممنونم

با توجه به راهنمایی شما تو google جستجو کردم و یه کد پیدا کردم که هر سرویسی رو که بخواین STOP یا START میکنه.چون دیدم خیلی از دوستان این مشکل رو دارن این مثال رو که باعث Stop و Start کردن SQL SERVICE MANAGER میشه اینجا میزارم تا همه بتونن استفاده کنن ، قبلش روی فرمتون دوتا button بزارین و این دستورات رو به جای دستورات یونیتتون کپی کنید.هر سرویس دیگهای رو هم که خواستید STOP یا START کنین فقط کافیه توی دستوری که روی Button تون گذاشتید اسم اون سرویس رو به جای MSSQLServer وارد کنید.


unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,WinSvc, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// convert status codes returned by
// ServiceGetStatus() to string values
function ServiceGetStrCode(nID : integer) : string;
var
s : string;
begin
case nID of
SERVICE_STOPPED : s := 'STOPPED';
SERVICE_RUNNING : s := 'RUNNING';
SERVICE_PAUSED : s := 'PAUSED';
SERVICE_START_PENDING : s := 'START/PENDING';
SERVICE_STOP_PENDING : s := 'STOP/PENDING';
SERVICE_CONTINUE_PENDING : s := 'CONTINUE/PENDING';
SERVICE_PAUSE_PENDING : s := 'PAUSE/PENDING';
else
s := 'UNKNOWN';
end;
Result := s;
end;

// 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 (file://\\SERVER)
// empty = local machine
// sService
// service name, ie: Alerter
function ServiceGetStatus(sMachine,
sService : string) : DWord;
var
schm : SC_Handle; //service control manager handle
schs : SC_Handle; // service handle
ss : TServiceStatus; // service status
dwStat : DWord; // current service status
begin
dwStat := 1;
// connect to the service control manager
schm := OpenSCManager( PChar(sMachine), Nil,
SC_MANAGER_CONNECT);
// if successful...
if(schm > 0)then
begin
// open a handle to the specified service
// we want to query service status
schs := OpenService( schm, PChar(sService),
SERVICE_QUERY_STATUS);
// if successful...
if(schs > 0)then
begin
// retrieve the current status
//of the specified service
if (QueryServiceStatus( schs, ss)) then
begin
dwStat := ss.dwCurrentState;
end;
// close service handle
CloseServiceHandle(schs);
end;
// close service control manager handle
CloseServiceHandle(schm);
end;
Result := dwStat;
end;

// 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 ServiceRunning(sMachine,
sService : string) : boolean;
begin
Result := SERVICE_RUNNING =
ServiceGetStatus(sMachine, sService);
end;

// Return TRUE if the specified service was stopped,
// defined by the status code SERVICE_STOPPED.
function ServiceStopped(sMachine,
sService : string) : boolean;
begin
Result := SERVICE_STOPPED =
ServiceGetStatus(sMachine, sService);
end;

// Return TRUE if successful
function ServiceStart(sMachine,
sService : string) : boolean;
var
schm,
schs : SC_Handle;
ss : TServiceStatus;
psTemp : PChar;
dwChkP : DWord; // check point
begin
ss.dwCurrentState := 1;
// connect to the service control manager
schm := OpenSCManager(PChar(sMachine), nil,
SC_MANAGER_CONNECT);
// if successful...
if(schm > 0)then
begin
// open a handle to the specified service
// we want to start the service and query service
// status
schs := OpenService(schm, PChar(sService),
SERVICE_START or SERVICE_QUERY_STATUS);
// if successful...
if(schs > 0)then
begin
psTemp := Nil;
if(StartService( schs, 0,psTemp))then
begin
// check status
if(QueryServiceStatus(schs, ss))then
begin
while(SERVICE_RUNNING <> ss.dwCurrentState)do
begin
// dwCheckPoint contains a value that the
// service increments periodically to
// report its progress during a
// lengthy operation. Save current value
dwChkP := ss.dwCheckPoint;
// wait a bit before checking status again
// dwWaitHint is the estimated amount of
// time the calling program should wait
// before calling QueryServiceStatus()
// again. Idle events should be
// handled here...
Sleep(ss.dwWaitHint);
if not QueryServiceStatus(schs, ss) then
begin
// couldn't check status break from the
// loop
break;
end;
if ss.dwCheckPoint < dwChkP then
begin
// QueryServiceStatus didn't increment
// dwCheckPoint as it should have.
// Avoid an infinite loop by breaking
break;
end;
end;
end;
end;
// close service handle
CloseServiceHandle(schs);
end;
// close service control manager handle
CloseServiceHandle(schm);
end;
// Return TRUE if the service status is running
Result := SERVICE_RUNNING = ss.dwCurrentState;
end;

function ServiceStop(sMachine,
sService : string) : boolean;
var
schm,
schs : SC_Handle;
ss : TServiceStatus;
dwChkP : DWord;
begin
// connect to the service control manager
schm := OpenSCManager(PChar(sMachine), nil,
SC_MANAGER_CONNECT);
// if successful...
if schm > 0 then
begin
// open a handle to the specified service
// we want to stop the service and
// query service status
schs := OpenService( schm, PChar(sService),
SERVICE_STOP or SERVICE_QUERY_STATUS);
// if successful...
if schs > 0 then
begin
if ControlService(schs, SERVICE_CONTROL_STOP,
ss) then
begin
// check status
if(QueryServiceStatus(schs, ss))then
begin
while(SERVICE_STOPPED <> ss.dwCurrentState)do
begin
// dwCheckPoint contains a value that the
// service increments periodically to
// report its progress during a lengthy
// operation. Save current value
dwChkP := ss.dwCheckPoint;
// Wait a bit before checking status again.
// dwWaitHint is the estimated amount of
// time the calling program should wait
// before calling QueryServiceStatus()
// again. Idle events should be
// handled here...
//Sleep(ss.dwWaitHint);
if(not QueryServiceStatus(schs,ss))then
begin
// couldn't check status
// break from the loop
break;
end;
if(ss.dwCheckPoint <
dwChkP)then
begin
// QueryServiceStatus didn't increment
// dwCheckPoint as it should have.
// Avoid an infinite loop by breaking
break;
end;
end;
end;
end;
// close service handle
CloseServiceHandle(schs);
end;
// close service control manager handle
CloseServiceHandle(schm);
end;
// return TRUE if the service status is stopped
Result := SERVICE_STOPPED = ss.dwCurrentState;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
f:Boolean;
begin
f:=false;
f:=ServiceStop('','MSSQLServer');
//if f=true then
//ShowMessage('yes')
//else
//ShowMessage('no');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ServiceStart('','MSSQLServer');
end;
end.