连接SQLServer数据库前,怎么判断服务是否已经启动?

时间:2022-06-01 18:44:35
如题,在连接SQLServer数据库前,想先判断一下SQLServer服务是否已经启动,如果没有则启动,然后连接数据库?

22 个解决方案

#1


方法1:先得到自己的机器名,在和sqlServer列表,作对比,看在不在里面。
方法2:可能存在更简便的方法2。
good luck!
{=================================================================
  功  能: 返回网络中SQLServer列表
  参  数:
          List: 需要填充的List
  返回值: 成功:  True,并填充List  失败 False
  备 注:
  版 本:
    1.0  2002/10/02 22:44:00
=================================================================}
Function GetSQLServerList(var List: Tstringlist): boolean;
var
   i: integer;
   sRetValue: String;
   SQLServer: Variant;
   ServerList: Variant;
begin
  Result := False;
  List.Clear;
  try
    SQLServer := CreateOleObject('SQLDMO.Application');
    ServerList := SQLServer.ListAvailableSQLServers;
    for i := 1 to Serverlist.Count do
      list.Add (Serverlist.item(i));
    Result := True;
  Finally
    SQLServer := NULL;
    ServerList := NULL;
  end;
end;

#2


顶一下

#3


你如果用了ADOconnection控件连接SQL,那么只要这样:
try
  adoconnection.connected:=true;
  showmeessage('ok');
except
  showmessage('no');
end;

#4


占个学习

#5


谢谢各位,有没有直接可以查看进程来解决的办法?

#6


转贴framework 的回答
把sql server 的协议配置成用tcp/ip的 
sql server的默认端口为1433,接着就用socket连接1433连接成功表示已经启动,

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ScktComp;

type
  TForm1 = class(TForm)
    ClientSocket1: TClientSocket;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  ClientSocket1.Address := '127.0.0.1';
  ClientSocket1.Port := 1433;
  ClientSocket1.Active := True;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  ShowMessage('server is open');
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  if ErrorCode=10061 then
  begin
    ShowMessage('Server does not open ');
    ErrorCode := 0;
  end;
end;

end.


窗体文件
object Form1: TForm1
  Left = 192
  Top = 107
  Width = 696
  Height = 480
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 104
    Top = 160
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
  object ClientSocket1: TClientSocket
    Active = False
    ClientType = ctNonBlocking
    Port = 0
    OnConnect = ClientSocket1Connect
    OnError = ClientSocket1Error
    Left = 104
    Top = 112
  end
end


你必须先用sql server的客户端网络实用工具进行tcp/ip协议的配置 

#7


当然有了,但是我忘记放在什么地方了,我给你找找把。

#8


关注学习!!

#9


加强学习!

#10


认真学习ing

#11


有没有直接可以查看服务或进程来解决的办法?

#12


刚刚做了一个类似的工具,你可判断一下系统服务中(或远程服务器) MSSQLServer 服务的状态可知是否启动了,也可以打开此服务,再进行连接,但你需要有相应的权限。

#13


Good Good Study,Day Day UP!

#14


!

#15


其实判断本机MSSQLSERVER这个服务是否启动就可以知道了。很简单的

远程的嘛,只有连接试试看了,连上就是启动了,没连上就是没启动。

#16


强人好多

#17


//最笨又最简单的办法:
function LinkDB(const adocnn: TADOConnection): Boolean;
begin
  Result := False;
  try
    adocnn.Connected := True;
  except
    Result := False;
  end;
end;

#18


//错了,应该是这样:

function LinkDB(const adocnn: TADOConnection): Boolean;
begin
  Result := False;
  try
    adocnn.Connected := True;
    Result := True;
  except
    Exit;
  end;
end;

#19


谢谢各位的回答,可能是我没有说清楚。在这里,要连接的数据库信息是用INI文件动态配置的,包括服务器、数据库、用户名和密码,连接字符串自然也提取INI文件的内容动态生成的,然后用ADOC去连接。所以,我想做的是,首先判断SQL服务是否启动,如果启动就去连接数据库,如果没有要先启动服务然后再去连接,因此这个判断是不能根据Connected属性来决定的。现在我想知道怎么获取服务,或者进程来判断,这样才有意义。

#20


???

#21



uses Tlhelp32;

procedure TForm1.Button1Click(Sender: TObject);
var
  ProcessList : Thandle;
  pe : TPROCESSENTRY32;
  ProcList : TStringList;
  i : integer;
begin
  ProcList := TStringList.Create;
  try
    ProcessList := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    pe.dwSize := sizeof(TPROCESSENTRY32);
    if process32first(ProcessList,pe) then
    begin
      ProcList.Add(pe.szexefile);
      while process32next(ProcessList,pe) do
        ProcList.Add(pe.szexefile);
    end;
    for i := 0 to ProcList.Count -1 do
      if ProcList[i] = 'sqlservr.exe' then
         ShowMessage('SQL Server already Run!');
  finally
    ProcList.Free;
  end;
end;

#22


谢谢  VeryOldMan(老者) !

我要的就是这个东西,下面补充一点,顺便揭帖。 
scm -action 1 -slient 1 -service mssqlserver  //启动

scm -action 6 -slient 1 -service mssqlserver  //停止

#1


方法1:先得到自己的机器名,在和sqlServer列表,作对比,看在不在里面。
方法2:可能存在更简便的方法2。
good luck!
{=================================================================
  功  能: 返回网络中SQLServer列表
  参  数:
          List: 需要填充的List
  返回值: 成功:  True,并填充List  失败 False
  备 注:
  版 本:
    1.0  2002/10/02 22:44:00
=================================================================}
Function GetSQLServerList(var List: Tstringlist): boolean;
var
   i: integer;
   sRetValue: String;
   SQLServer: Variant;
   ServerList: Variant;
begin
  Result := False;
  List.Clear;
  try
    SQLServer := CreateOleObject('SQLDMO.Application');
    ServerList := SQLServer.ListAvailableSQLServers;
    for i := 1 to Serverlist.Count do
      list.Add (Serverlist.item(i));
    Result := True;
  Finally
    SQLServer := NULL;
    ServerList := NULL;
  end;
end;

#2


顶一下

#3


你如果用了ADOconnection控件连接SQL,那么只要这样:
try
  adoconnection.connected:=true;
  showmeessage('ok');
except
  showmessage('no');
end;

#4


占个学习

#5


谢谢各位,有没有直接可以查看进程来解决的办法?

#6


转贴framework 的回答
把sql server 的协议配置成用tcp/ip的 
sql server的默认端口为1433,接着就用socket连接1433连接成功表示已经启动,

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ScktComp;

type
  TForm1 = class(TForm)
    ClientSocket1: TClientSocket;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  ClientSocket1.Address := '127.0.0.1';
  ClientSocket1.Port := 1433;
  ClientSocket1.Active := True;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  ShowMessage('server is open');
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  if ErrorCode=10061 then
  begin
    ShowMessage('Server does not open ');
    ErrorCode := 0;
  end;
end;

end.


窗体文件
object Form1: TForm1
  Left = 192
  Top = 107
  Width = 696
  Height = 480
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 104
    Top = 160
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
  object ClientSocket1: TClientSocket
    Active = False
    ClientType = ctNonBlocking
    Port = 0
    OnConnect = ClientSocket1Connect
    OnError = ClientSocket1Error
    Left = 104
    Top = 112
  end
end


你必须先用sql server的客户端网络实用工具进行tcp/ip协议的配置 

#7


当然有了,但是我忘记放在什么地方了,我给你找找把。

#8


关注学习!!

#9


加强学习!

#10


认真学习ing

#11


有没有直接可以查看服务或进程来解决的办法?

#12


刚刚做了一个类似的工具,你可判断一下系统服务中(或远程服务器) MSSQLServer 服务的状态可知是否启动了,也可以打开此服务,再进行连接,但你需要有相应的权限。

#13


Good Good Study,Day Day UP!

#14


!

#15


其实判断本机MSSQLSERVER这个服务是否启动就可以知道了。很简单的

远程的嘛,只有连接试试看了,连上就是启动了,没连上就是没启动。

#16


强人好多

#17


//最笨又最简单的办法:
function LinkDB(const adocnn: TADOConnection): Boolean;
begin
  Result := False;
  try
    adocnn.Connected := True;
  except
    Result := False;
  end;
end;

#18


//错了,应该是这样:

function LinkDB(const adocnn: TADOConnection): Boolean;
begin
  Result := False;
  try
    adocnn.Connected := True;
    Result := True;
  except
    Exit;
  end;
end;

#19


谢谢各位的回答,可能是我没有说清楚。在这里,要连接的数据库信息是用INI文件动态配置的,包括服务器、数据库、用户名和密码,连接字符串自然也提取INI文件的内容动态生成的,然后用ADOC去连接。所以,我想做的是,首先判断SQL服务是否启动,如果启动就去连接数据库,如果没有要先启动服务然后再去连接,因此这个判断是不能根据Connected属性来决定的。现在我想知道怎么获取服务,或者进程来判断,这样才有意义。

#20


???

#21



uses Tlhelp32;

procedure TForm1.Button1Click(Sender: TObject);
var
  ProcessList : Thandle;
  pe : TPROCESSENTRY32;
  ProcList : TStringList;
  i : integer;
begin
  ProcList := TStringList.Create;
  try
    ProcessList := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    pe.dwSize := sizeof(TPROCESSENTRY32);
    if process32first(ProcessList,pe) then
    begin
      ProcList.Add(pe.szexefile);
      while process32next(ProcessList,pe) do
        ProcList.Add(pe.szexefile);
    end;
    for i := 0 to ProcList.Count -1 do
      if ProcList[i] = 'sqlservr.exe' then
         ShowMessage('SQL Server already Run!');
  finally
    ProcList.Free;
  end;
end;

#22


谢谢  VeryOldMan(老者) !

我要的就是这个东西,下面补充一点,顺便揭帖。 
scm -action 1 -slient 1 -service mssqlserver  //启动

scm -action 6 -slient 1 -service mssqlserver  //停止