Delphi下检查SQL Server服务器当前运行状态!

 

Delphi下检查SQL Server服务器当前运行状态!
要求:Delphi下随时监控SQL Server状态。
1、命令提示符下可用:TELNET <SQL Server IP> 1433  检查。
2、Delphi下如何模拟实现上述功能。
----------
原来做过:
function GetSqlServerStatus(lpszComputerName: LPCTSTR): Integer;
var
  ssStatus: SERVICE_STATUS;
  dwOldCheckPoint: DWORD;
  dwStartTickCount: DWORD;
  dwWaitTime: DWORD;
  dwStatus: DWORD;
  lpszServiceName: LPCTSTR;
  schSCManager: SC_HANDLE;
  schService: SC_HANDLE;
begin
  if (lpszComputerName <> nil) and
      ((StrComp(lpszComputerName, '127.0.0.1') = 0) or (StrComp(lpszComputerName, '.') = 0)) then
    lpszComputerName := nil;
  lpszServiceName := 'MSSQLServer';
  schSCManager := OpenSCManager(
    lpszComputerName,         //Computer name
    nil,          // ServicesActive database
    SC_MANAGER_ALL_ACCESS);  // full access rights

  if schSCManager = 0 then
    GetSqlServerStatus := -1;        //Machine not exists
  schService := OpenService(
    schSCManager,          // SCM database
    lpszServiceName,          // service name
    SERVICE_ALL_ACCESS);
  if schService = 0 then  begin
    CloseServiceHandle(schService);
    GetSqlServerStatus := -2;  //SqlServer Service not Exists
  end;
  if not QueryServiceStatus(
    schService,   // handle to service
    ssStatus) then begin  // address of status information structure
    GetSqlServerStatus := -3;   //MyErrorExit('QueryServiceStatus');
  Result := ssStatus.dwCurrentState;
end;
//----------
网上找的,看看有用不
uses   Registry,   ShellAPI,   FileCtrl,   Unit2;  
  {$R   *.DFM}  
   
  function   IsNT:   Boolean;  
  begin  
      Result   :=   (Win32MajorVersion   >=   4)   and   (Win32Platform   =   VER_PLATFORM_WIN32_NT);  
  end;  
  var  
      IsExists:   Boolean   =   False;  
  function   IsExistsMSSQL:   Boolean;  
  const  
      MSSQLSERVER   =   'SOFTWARE/Microsoft/MSSQLServer';  
      Reg:   TRegistry;  
      Result   :=   IsExists;  
      if   Result   then   Exit;  
      if   not   IsNT   then  
          Reg   :=   TRegistry.Create   else  
          Reg   :=   TRegistry.Create(KEY_READ);  
      with   Reg   do  
      try  
          Reg.RootKey   :=   HKEY_LOCAL_MACHINE;  
          Result   :=   KeyExists(MSSQLSERVER);  
          IsExists   :=   Result;  
      finally  
          Free;  
      end;  
      MSSQL_98StartCommand   =   'scm   -action   1   -pwd   "%s"';  
      MSSQL_NTStartCommand   =   'net   start   mssqlserver';  
      MSSQL_98StopCommand   =   'scm   -action   6';  
      MSSQL_NTStopCommand   =   'net   stop   mssqlserver';  
  function   StartMSSQL(Pass:   string):   Boolean;  
      S:   string;  
      Screen.Cursor   :=   crHourGlass;  
          if   not   IsNT   then  
          S   :=   Format(MSSQL_98StartCommand,   [Pass])   else  
          S   :=   MSSQL_NTStartCommand;  
          try  
          WinExec(PChar(S),   SW_HIDE);  
          Result   :=   True;  
          except  
          Result   :=   False;  
          end;  
          Screen.Cursor   :=   crDefault;  
  function   StopMSSQL:   Boolean;  
          WinExec(MSSQL_98StopCommand,   SW_HIDE)   else  
          WinExec(MSSQL_NTStopCommand,   SW_HIDE);  
  procedure   TForm1.Button2Click(Sender:   TObject);  
      if   StartMSSQL(edPass.Text)   then  
          MessageBox(Handle,   '启动完成',   '完成',   MB_OK   +   MB_ICONINFORMATION);  
----------------------------------------------
program Project1;
uses
Windows,
WinSvc;
procedure RunMSSQLSERVICE;
SrvHandle: SC_HANDLE;
Service_Status: _SERVICE_STATUS;
SrvStatus : Integer;
try
SrvHandle := OpenSCManager('', SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS);
SrvHandle := OpenService(SrvHandle, PChar('MSSQLServer'), SERVICE_QUERY_STATUS or SERVICE_START);
if QueryServiceStatus(SrvHandle, Service_Status)
then
SrvStatus := Service_Status.dwCurrentState;
if SrvStatus = SERVICE_STOPPED
Winexec('scm -action 1 -slient 1 -service mssqlserver ',sw_Normal);
except
RunMSSQLSERVICE;
end.
获取SQL Server服务器列表的几种方法
 
一、      SQL DMO
描述:SQL Distributed Management Objects(SQL分布式管理对象),存在于SQLDMO.dll文件中,实际上是一个COM 对象,通过调用SQL DMO的ListAvailableSQLServers方法取得。
列表类型:列举装有“客户端”和“服务端”的计算机
适用条件:装有 SQL Server,且有SQLDMO.dll文件。
速度:中
调用示例:GetSQLServerList(ListBox1.items);
代码:
  ComObj;
function GetSQLServerList(var AList: TStrings): Boolean;
  SQLServerApp: Variant;
  ServerList: Variant;
  i: Integer;
  Result := True;
  try
    SQLServerApp := CreateOleObject('SQLDMO.Application');
    ServerList := SQLServerApp.ListAvailableSQLServers;
    for i := 1 to ServerList.Count do
      AList.Add(ServerList.Item(i));
    SQLServerApp := Unassigned;
    ServerList := Unassigned;
  except
    Result := False;
二、      NetServerEnum
描述:网络服务函数,存在于NetApi32.dll文件中;通过NetServerEnum函数可取得装有SQL Server服务端的计算机列表,只装有SQL Server客户端的计算机将不会被列举其中;如果一台计算机的SQL Server服务刚刚启动,那么此函数将会过很久才能取到该计算机。
列表类型:仅列举装有“服务端”的计算机。
适用条件:有NetApi32.dll文件。
速度:快
type
  NET_API_STATUS = DWORD;
  PServerInfo100 = ^TServerInfo100;
  _SERVER_INFO_100 = record
    sv100_platform_id: DWORD;
    sv100_name: LPWSTR;
  {$EXTERNALSYM _SERVER_INFO_100}
  TServerInfo100 = _SERVER_INFO_100;
  SERVER_INFO_100 = _SERVER_INFO_100;
  {$EXTERNALSYM SERVER_INFO_100}
const
  NERR_Success = 0;
  MAX_PREFERRED_LENGTH = DWORD(-1);
  SV_TYPE_SQLSERVER    = $00000004;
function NetApiBufferAllocate(ByteCount: DWORD; var Buffer: Pointer):
  NET_API_STATUS; stdcall; external 'netapi32.dll' name 'NetApiBufferAllocate';
function NetServerEnum(ServerName: LPCWSTR; Level: DWORD; var BufPtr: Pointer;
  PrefMaxLen: DWORD; var EntriesRead: DWORD; var TotalEntries: DWORD;
  ServerType: DWORD; Domain: LPCWSTR; ResumeHandle: PDWORD): NET_API_STATUS;
  stdcall; external 'netapi32.dll' name 'NetServerEnum';
function NetApiBufferFree(Buffer: Pointer): NET_API_STATUS; stdcall; external
'netapi32.dll' name 'NetApiBufferFree';
function GetSQLServerList(var AList: TStrings; pwcServerName: PWChar = nil;
  pwcDomain: PWChar = nil): Boolean;
  NetAPIStatus: DWORD;
  dwLevel: DWORD;
  pReturnSvrInfo: Pointer;
  dwPrefMaxLen: DWORD;
  dwEntriesRead: DWORD;
  dwTotalEntries: DWORD;
  dwServerType: DWORD;
  dwResumeHandle: PDWORD;
  pCurSvrInfo: PServerInfo100;
  i, j: Integer;
    dwLevel := 100;
    pReturnSvrInfo := nil;
    dwPrefMaxLen := MAX_PREFERRED_LENGTH;
    dwEntriesRead := 0;
    dwTotalEntries := 0;
    dwServerType := SV_TYPE_SQLSERVER;    //服务器类型
    dwResumeHandle := nil;
    NetApiBufferAllocate(SizeOf(pReturnSvrInfo), pReturnSvrInfo);
    try
      NetAPIStatus := NetServerEnum(pwcServerName, dwLevel, pReturnSvrInfo,
        dwPrefMaxLen, dwEntriesRead, dwTotalEntries, dwServerType, pwcDomain,
        dwResumeHandle);
      if ((NetAPIStatus = NERR_Success) or (NetAPIStatus = ERROR_MORE_DATA)) and
        (pReturnSvrInfo <> nil) then
      begin
        pCurSvrInfo := pReturnSvrInfo;
        // 循环取得所有SQL Server服务器
        i := 0;
        j := dwEntriesRead;
        while i < j do
        begin
          if pCurSvrInfo = nil then
            Break;
          with AList do
            Add(pCurSvrInfo^.sv100_name);
          Inc(i);
          Inc(pCurSvrInfo);
        end;
      end;
    finally
      if Assigned(pReturnSvrInfo) then
        NetApiBufferFree(pReturnSvrInfo);
    end;
三、      SQLBrowseConnect
描述:ODBC函数(Microsoft Open Database Connectivity,开放式数据库连接),存在于odbc32.dll文件中;通过SQLBrowseConnect函数可返回连接字符串信息,包括DSN、DRIVER、SERVER、UID、PWD、APP、WSID、DATABASE、LANGUAGE等信息。在函数GetODBCInfo 中传入itServer、itDatabase、itLanguage可分别取得“服务器”、“数据库”及“语言”等信息列表,其中 itDatabase、itLanguage默认取本地信息,取远程信息请自行修改“'Driver={SQL Server};SERVER=(local);UID=sa;PWD='”连接字符串。
适用条件:由于MDAC 2.6 、2.6 SP1、2.7和Microsoft ODBC Driver for SQL Server 2000 2000.80.194有Bug,因此在这些版本中此函数无法取得Microsoft SQL Server 7.0的服务器。
调用示例:GetODBCInfo(ListBox1.items, itServer);
  TInfoType = (itServer, itDatabase, itLanguage);
  SQLHANDLE    = Pointer;
  SQLSMALLINT  = SHORT;
  SQLINTEGER   = LongInt;
  PSQLHANDLE   = ^SQLHANDLE;
  SQLHENV      = SQLHANDLE;
  SQLHDBC      = SQLHANDLE;
  SQLRETURN    = SQLSMALLINT;
  SQLCHAR      = UCHAR;
  PSQLCHAR     = ^SQLCHAR;
  SQLPOINTER   = Pointer;
  PSQLSMALLINT = ^SQLSMALLINT;
function SQLAllocHandle(HandleType: SQLSMALLINT; InputHandle: SQLHANDLE;
  OutputHandle: PSQLHANDLE): SQLRETURN; stdcall; external 'odbc32.dll' name
  'SQLAllocHandle';
function SQLSetEnvAttr(EnvironmentHandle: SQLHENV; Attribute: SQLINTEGER;
  Value: SQLPOINTER; StringLength: SQLINTEGER): SQLRETURN; stdcall; external
  'odbc32.dll' name 'SQLSetEnvAttr';
function SQLBrowseConnect(hdbc: SQLHDBC; szConnStrIn: PSQLCHAR;
  cbConnStrIn: SQLSMALLINT; szConnStrOut: PSQLCHAR;
  cbConnStrOutMax: SQLSMALLINT; pcbConnStrOut: PSQLSMALLINT): SQLRETURN;
  stdcall; external 'odbc32.dll' name 'SQLBrowseConnect';
function SQLDisconnect(ConnectionHandle: SQLHDBC): SQLRETURN; stdcall; external
  'odbc32.dll' name 'SQLDisconnect';
function SQLFreeHandle(HandleType: SQLSMALLINT; Handle: SQLHANDLE): SQLRETURN;
  stdcall; external  'odbc32.dll' name 'SQLFreeHandle';
  SQL_HANDLE_ENV        = 1;
  SQL_HANDLE_DBC        = 2;
  SQL_NULL_HANDLE       = LongInt(0);
  SQL_SUCCESS           = 0;
  SQL_ERROR             = -1;
  SQL_ATTR_ODBC_VERSION = 200;
  SQL_OV_ODBC3          = ULONG(3);
  SQL_NTS               = -3;
function GetODBCInfo(var AList: TStrings; InfoType: TInfoType): Boolean;
  ConnStrOutMax = 4824;
  SplitterStr = '={';
  HENV: SQLHENV;
  HDBC: SQLHDBC;
  RetCode: SQLRETURN;
  ConnStrOut: PSQLCHAR;
  cbConnStrOut: SQLSMALLINT;
  ConnStrIn, TmpStr: string;
  TmpPos: Integer;
  case InfoType of
    itServer: ConnStrIn := 'Driver={SQL Server}';
    itDatabase, itLanguage: ConnStrIn := 'Driver={SQL Server};SERVER=(local);UID=sa;PWD=';
  Result := False;
    // 分配 ODBC 环境句柄
    RetCode := SQLAllocHandle(SQL_HANDLE_ENV, SQLPOINTER(SQL_NULL_HANDLE), @HENV);
    if RetCode = SQL_ERROR then
      Exit;
    // 设置 ODBC 版本
    RetCode := SQLSetEnvAttr(HENV, SQL_ATTR_ODBC_VERSION, SQLPointer(SQL_OV_ODBC3), 0);
    if RetCode <> SQL_SUCCESS then
    // 分配数据库连接句柄
    RetCode := SQLAllocHandle(SQL_HANDLE_DBC, HENV, @HDBC);
    GetMem(ConnStrOut, ConnStrOutMax);
    RetCode := SQLBrowseConnect(HDBC, PSQLCHAR(ConnStrIn), SQL_NTS, ConnStrOut,
      ConnStrOutMax, @cbConnStrOut);
    if RetCode <> SQL_ERROR then
    begin
      TmpStr := PChar(ConnStrOut);
      if InfoType = itLanguage then
        Delete(TmpStr, 1, AnsiPos('};', TmpStr) + 1);
      Delete(TmpStr, 1, AnsiPos(SplitterStr, TmpStr) + 1);
      Delete(TmpStr, AnsiPos('}', TmpStr), Length(TmpStr));
      while TmpStr <> '' do
        TmpPos := AnsiPos(',', TmpStr);
        if TmpPos > 0 then
          AList.Add(Copy(TmpStr, 1, TmpPos - 1))
        else
          AList.Add(TmpStr);
          TmpStr := '';
        Delete(TmpStr, 1, TmpPos)
      Result := True;
    FreeMem(ConnStrOut, ConnStrOutMax);
  finally
    if Assigned(HDBC) then
      SQLDisconnect(HDBC);
      SQLFreeHandle(SQL_HANDLE_DBC, HDBC);
      HDBC := nil;
    if Assigned(HENV) then
      SQLFreeHandle(SQL_HANDLE_ENV, HENV);
      HENV := nil;
-------------------
构造一个连接字串,从一个ini文件读取参数。
var AppIni: TIniFile;
  IniFile, TFStr,: string;
  Source, User, Passwd, DBase: string;
  IniFile := ChangeFileExt(Application.ExeName, '.INI');
  if FileExists(IniFile) then
  begin
    AppIni := TIniFile.Create(IniFile);
      Source := AppIni.ReadString('DataBaseSet', 'Source', '');
      User := AppIni.ReadString('DataBaseSet', 'User', '');
      Passwd := AppIni.ReadString('DataBaseSet', 'Passwd', '');
      DBase := AppIni.ReadString('DataBaseSet', 'DBase', '');
      Provider := AppIni.ReadString('DataBaseSet', 'Provider', '');
      //Provider := 'SQLOLEDB.1'
    if Ado.Passwd = '' then TFStr := 'False' else TFStr := 'True';
    ADOCon.Close();
    ADOCon.ConnectionString :=
      'Locale Identifier=2052' +
      ';Use Procedure for Prepare=1' +
      ';Auto Translate=True' +
      ';Packet Size=4096' +
      ';Persist Security Info=' + TFStr +
      ';Provider=' + Ado.Provider +
      ';Password=' + Ado.Passwd +
      ';Workstation ID=' + Ado.Source +
      ';Connect Timeout=' + IntToStr(Ado.Time) +
      ';User ID=' + Ado.User +
      ';Data Source=' + Ado.Source +
      ';Initial Catalog=' + ADO.DBase;
    ADOCon.Open();
      Application.MessageBox('数据库连接失败,请通知系统管理员', '提示', MB_ICONWARNING);

 
 
 

posted on 2016-11-29 08:20  那里的天空  阅读(608)  评论(0编辑  收藏  举报

导航