2012-05-15 63 views
10

如果我是用C#我可以使用.NET Framework的SqlDataSourceEnumerator發現並顯示用戶在網絡上的SQL Server實例的列表。本地網絡上的枚舉Microsoft SQL數據庫服務器,用delphi

如何在Delphi中做到這一點?

+7

http://delphi.about.com/od/sqlservermsdeaccess/l/aa090704a.htm – Whiler

+0

我實際上使用了Whiler的鏈接代碼。如果您將該評論轉換爲答案並稍微擴展一下,我會接受它。 –

+0

完成...但正如我所說...一切已在他的頁面上解釋,我不想*竊取*他的內容:/ – Whiler

回答

4

枚舉所有可用的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什麼扎克的解釋補充。

+2

我冒昧地發佈了一個核心例程(來自真實代碼的片段),因爲我認爲這是可接受的實踐,並且通常在互聯網上。這裏沒有意圖從Zarko竊取,讚美Zarkmeister和Uber-About-Delphi-Guy。 :-) –

+0

好吧,順便說一句,感謝'接受' – Whiler

+0

事實上,鏈接不再工作... –

4

我用這個代碼:

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; 
+0

不要忘記設置ADODB在使用 – Ravaut123

+0

和其他一些。 (作了有效的使用條款。) –

相關問題