//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;
浙公网安备 33010602011771号