如果我是用C#我可以使用.NET Framework的SqlDataSourceEnumerator發現並顯示用戶在網絡上的SQL Server實例的列表。本地網絡上的枚舉Microsoft SQL數據庫服務器,用delphi
如何在Delphi中做到這一點?
如果我是用C#我可以使用.NET Framework的SqlDataSourceEnumerator發現並顯示用戶在網絡上的SQL Server實例的列表。本地網絡上的枚舉Microsoft SQL數據庫服務器,用delphi
如何在Delphi中做到這一點?
枚舉所有可用的Microsoft SQL服務器,你可以按照這個優秀的教程:
Enumerating available SQL Servers. Retrieving databases on a SQL Server
包括在Zarko的教程,有一個鏈接到download the full source code這可以用來快速測試它,並檢查它是否適合y我們的需求。
編輯扎克Gajic的主程序是:
procedure ListAvailableSQLServers(Names : TStrings);
var
RSCon: ADORecordsetConstruction;
Rowset: IRowset;
SourcesRowset: ISourcesRowset;
SourcesRecordset: _Recordset;
SourcesName, SourcesType: TField;
function PtCreateADOObject(const ClassID: TGUID): IUnknown;
var
Status: HResult;
FPUControlWord: Word;
begin
asm
FNSTCW FPUControlWord
end;
Status := CoCreateInstance(
CLASS_Recordset,
nil,
CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER,
IUnknown,
Result);
asm
FNCLEX
FLDCW FPUControlWord
end;
OleCheck(Status);
end;
begin
SourcesRecordset := PtCreateADOObject(CLASS_Recordset) as _Recordset;
RSCon := SourcesRecordset as ADORecordsetConstruction;
SourcesRowset := CreateComObject(ProgIDToClassID('SQLOLEDB Enumerator')) as ISourcesRowset;
OleCheck(SourcesRowset.GetSourcesRowset(nil, IRowset, 0, nil, IUnknown(Rowset)));
RSCon.Rowset := RowSet;
with TADODataSet.Create(nil) do
try
Recordset := SourcesRecordset;
SourcesName := FieldByName('SOURCES_NAME'); { do not localize }
SourcesType := FieldByName('SOURCES_TYPE'); { do not localize }
Names.BeginUpdate;
try
while not EOF do
begin
if (SourcesType.AsInteger = DBSOURCETYPE_DATASOURCE) and (SourcesName.AsString <> '') then
Names.Add(SourcesName.AsString);
Next;
end;
finally
Names.EndUpdate;
end;
finally
Free;
end;
end;
我不知道我可以毫不lamering什麼扎克的解釋補充。
我冒昧地發佈了一個核心例程(來自真實代碼的片段),因爲我認爲這是可接受的實踐,並且通常在互聯網上。這裏沒有意圖從Zarko竊取,讚美Zarkmeister和Uber-About-Delphi-Guy。 :-) –
好吧,順便說一句,感謝'接受' – Whiler
事實上,鏈接不再工作... –
您可以使用NetServerEnum函數,通過在servertype參數中篩選SV_TYPE_SQLSERVER
值,另一個選項是使用SQLOLEDB Enumerator
ADO對象。
我用這個代碼:
uses ActiveX,
ComObj,
OleDB,
DB,
ADOInt,
ADODB;
procedure ListAvailableSQLServers(Names: TStringList);
var
RSCon: ADORecordsetConstruction;
Rowset: IRowset;
SourcesRowset: ISourcesRowset;
SourcesRecordset: _Recordset;
SourcesName, SourcesType: TField;
function PtCreateADOObject(const ClassID: TGUID): IUnknown;
var
Status: HResult;
FPUControlWord: Word;
begin
asm
FNSTCW FPUControlWord
end;
Status := CoCreateInstance(
CLASS_Recordset,
nil,
CLSCTX_INPROC_SERVER or
CLSCTX_LOCAL_SERVER,
IUnknown,
Result);
asm
FNCLEX
FLDCW FPUControlWord
end;
OleCheck(Status);
end;
begin
SourcesRecordset :=
PtCreateADOObject(CLASS_Recordset)
as _Recordset;
RSCon :=
SourcesRecordset
as ADORecordsetConstruction;
SourcesRowset :=
CreateComObject(ProgIDToClassID('SQLOLEDB Enumerator'))
as ISourcesRowset;
OleCheck(SourcesRowset.GetSourcesRowset(
nil,
IRowset, 0,
nil,
IUnknown(Rowset)));
RSCon.Rowset := RowSet;
with TADODataSet.Create(nil) do
try
Recordset := SourcesRecordset;
SourcesName := FieldByName('SOURCES_NAME');
SourcesType := FieldByName('SOURCES_TYPE');
Names.BeginUpdate;
Names.Clear;
try
while not EOF do
begin
if (SourcesType.AsInteger = DBSOURCETYPE_DATASOURCE) and
(SourcesName.AsString <> '') then
Names.Add(SourcesName.AsString);
Next;
end;
finally
Names.EndUpdate;
end;
finally
Free;
end;
end;
procedure GetServer();
var
oItems: TStringList;
begin
oItems:= TStringList.Create;
try
ListAvailableSQLServers(oItems);
// To something with oItems
ShowMessage(oItems.Text);
finally
oItems.Free;
end;
end;
不要忘記設置ADODB在使用 – Ravaut123
和其他一些。 (作了有效的使用條款。) –
http://delphi.about.com/od/sqlservermsdeaccess/l/aa090704a.htm – Whiler
我實際上使用了Whiler的鏈接代碼。如果您將該評論轉換爲答案並稍微擴展一下,我會接受它。 –
完成...但正如我所說...一切已在他的頁面上解釋,我不想*竊取*他的內容:/ – Whiler