在用DELPHI做还原数据库时 老是出现 “数据库正在运行” 还原数据库失败的问题。我想通过这样来解决: 在还原数据库前先停止数据库的运行,还原数据库之后 再让数据库运行。不知 这样是否可以?另外,在DELPHI中如何控制SQL SERVER的“停止、运行”?
请高手 指点,谢谢。

解决方案 »

  1.   

    OpenSCManager,CloseServiceHandle, CreateService, EnumServicesStatus, LockServiceDatabase, OpenService, QueryServiceLockStatus
      

  2.   

    我也是有这样的问题,不知如何解决,有高见后给我发个邮件好不好
    [email protected]
      

  3.   

    to DWGZ() ( ) : 能否具体点?
      

  4.   

    1 你应该将你的连接放到其他数据库上,并且中断其他用户的访问该数据库的进程,查查以前的帖子,问过很多
    2 停止sql server可以用
    EXEC xp_cmdshell 'net stop sqlserver', no_output
      

  5.   

    两种方法:1. net start, net stop2. 最好上顶楼的说的, 用win32 api:
    OpenSCManager
    OpenService
    QueryServiceStatus
    StartService     // 停止-->启动
    ControlService   // 暂停-->启动
      

  6.   

    兄弟,那在Delphi中如何写啊?
    难道这样写:
    procedure Tfrm_store_n.Button3Click(Sender: TObject);
    begin
     StartService ;
      ControlService    
    end;
    这样行吗?
      

  7.   

    还有前面三个什么意思?
    本人E文差,看了半天的MSDN也搞不东。
      

  8.   

    请单独建立一个单元文件,如:SQLServerUnit
    然后在interface部分写:function StartSQLServer(szErrorMsg:string):Boolean;
    在implementation部分写:const
       SERVICE_UNKNOWN =0;type
       enumSQLSCMCommands=(SQLSCMCmd_STOP,SQLSCMCmd_PAUSE,SQLSCMCmd_START,SQLSCMCmd_CONTINUE);
    const
      wn95scm='w95scm.dll';
    // Function prototypes
    function SQLSCMLocalServiceControlA(lpszSvc:LPSTR;iCommand:integer;
      pdwErr:LPDWORD;iCount:integer;lpStartParameter:Pointer):BOOL;stdcall
      external wn95scm name 'SQLSCMLocalServiceControlA';
    function SQLSCMLocalServiceControlW(lpszSvc:LPWSTR;iCommand:integer;
      pdwErr:LPDWORD;iCount:integer;lpStartParameter:Pointer):BOOL;stdcall
      external wn95scm name 'SQLSCMLocalServiceControlW';
    function SQLSCMGetLocalServiceStateA(lpszSvc:LPSTR;pdwErr:LPDWORD):DWORD;stdcall
      external wn95scm name 'SQLSCMGetLocalServiceStateA';
    function SQLSCMGetLocalServiceStateW(pwszSvc:LPWSTR;pdwErr:LPDWORD):DWORD;stdcall
      external wn95scm name 'SQLSCMGetLocalServiceStateW';
      
    {$ifdef UNICODE}
    function SQLSCMLocalServiceControl(lpszSvc:LPSTR;iCommand:integer;
      pdwErr:LPDWORD;iCount:integer;lpStartParameter:Pointer):BOOL;stdcall
      external wn95scm name 'SQLSCMLocalServiceControlW';
    function SQLSCMGetLocalServiceState(pwszSvc:LPWSTR;pdwErr:LPDWORD):DWORD;stdcall
      external wn95scm name 'SQLSCMGetLocalServiceStateW';
    {$else}
    function SQLSCMLocalServiceControl(lpszSvc:LPSTR;iCommand:integer;
      pdwErr:LPDWORD;iCount:integer;lpStartParameter:Pointer):BOOL;stdcall
      external wn95scm name 'SQLSCMLocalServiceControlA';
    function SQLSCMGetLocalServiceState(lpszSvc:LPSTR;pdwErr:LPDWORD):DWORD;stdcall
      external wn95scm name 'SQLSCMGetLocalServiceStateA';
    {$endif} // !UNICODEfunction StartSQLServer(szErrorMsg:string):Boolean;
    var
       szService:LPSTR;
       dwErr:PDWORD;
       dwServiceState:DWORD;
       bControlSuccessful:BOOL;
       lsStr:string;
    begin
       result:=false;   szService := 'MSSQLServer';   bControlSuccessful:=TRUE;
       dwServiceState := SQLSCMGetLocalServiceState(szService, dwErr);
       while ((dwServiceState <>0) and (bControlSuccessful = TRUE))do
       begin
          if (dwServiceState = SERVICE_RUNNING) then
               break;
          case dwServiceState of
             SERVICE_PAUSED:begin     // Paused, so continue.
                bControlSuccessful :=  SQLSCMLocalServiceControl(szService,
                   Ord(SQLSCMCmd_CONTINUE),dwErr, 0, nil);
             end;
             SERVICE_STOPPED:begin     // Stopped, start service.
                bControlSuccessful :=  SQLSCMLocalServiceControl(szService,
                   Ord(SQLSCMCmd_START), dwErr, 0, nil);
             end;
             else // Error if state is 0 otherwise state is changing.
             begin
                if (dwServiceState = 0) then
                begin    // Error. Return failure.
                   StrPCopy(PChar(dwErr),lsStr);
                   szErrorMsg:='Error '+lsStr+' on attempt to determine service state.';
                   exit;
                end;
             end;
          end;
          Sleep(5);
          dwServiceState := SQLSCMGetLocalServiceState(szService, dwErr);
       end;
       if (bControlSuccessful) then
       begin
          StrPCopy(PChar(dwErr),lsStr);
          szErrorMsg:='Error '+lsStr+' returned on attempt to change service state.';
       end;
       result:=bControlSuccessful;
    end;
    以上是启动SQL Server 的服务,至于停止服务可以根据以上代码自己编写,很容易实现的。
      

  9.   

    ok, 俺再说一下: 
    (好像还有另一种方法,通过service管理器api)1. 这种方式很简单, 你可以直接在命令行模式下手工试一下,
    net start mssqlserver
    net stop mssqlserver2. 
    OpenSCManager  --- 打开服务管理器
    OpenService   --- 打开一个服务
    QueryServiceStatus  --- 查询此服务的状态
    StartService     ---- 如果状态为"停止"的, 就调用这个.
    ControlService   ----- 如果状态为"暂停"的, 就调用这个.你如果要做一个控制程序,要注意,停止或者关闭一个服务, 可能会需要一些时间.俺这儿只有c++的例子, 你可以参见楼上的.
      

  10.   

    哎!各位,能不能来点投机取巧的办法。
    procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
    winexec('net start mssqlserver',SW_SHOW)
    end;
    停止的话就用stop代替start