fanybupt

日出而作,日入而息,凿井而饮,耕田而食,帝力于我何有哉?

导航

查找局域网内的所有SQLServer服务器

Posted on 2012-05-04 16:40  fanybupt  阅读(581)  评论(0)    收藏  举报

//uses OleDB, ComObj, ActiveX, ADOConst,DB, ADODB, ADOInt,SysUtils;


function CreateADOObject(const ClassID: TGUID): IUnknown;
var
  Status: HResult;
  FPUControlWord: Word;
begin
  asm
    FNSTCW  FPUControlWord
  end;
  Status := CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or
    CLSCTX_LOCAL_SERVER, IUnknown, Result);
  asm
    FNCLEX
    FLDCW FPUControlWord
  end;
  if (Status = REGDB_E_CLASSNOTREG) then
    raise Exception.CreateRes(@SADOCreateError) else
    OleCheck(Status);
end;

procedure BuildSQLServerList;
var
  oCon: ADORecordsetConstruction;
  oRowset: IRowset;
  oSourcesRowset: ISourcesRowset;
  oRecordset: _Recordset;
  strName: string; oServerNames: TStringList;
begin
  if Assigned(oServerNames)  then Exit;
 
  oServerNames :=TStringList.Create;
  oRecordset := CreateADOObject(CLASS_Recordset) as _Recordset;
  oCon := oRecordset as ADORecordsetConstruction;
  oSourcesRowset := CreateComObject(ProgIDToClassID('SQLOLEDB Enumerator')) as ISourcesRowset;
  OleCheck(oSourcesRowset.GetSourcesRowset(nil, IRowset, 0, nil, IUnknown(oRowset)));
  oCon.Rowset := oRowset;
  with TADODataSet.Create(nil) do
  try
    Recordset := oRecordset;
    while not EOF do
    begin
      if FieldByName('SOURCES_TYPE').AsInteger = DBSOURCETYPE_DATASOURCE then
      begin
        strName := FieldByName('SOURCES_NAME').AsString;
        if strName <> EmptyStr then oServerNames.Add(strName);
      end;
      Next;
    end;
  finally
    Free;
  end;
end;