2012-05-15 29 views
10

Nếu tôi đang sử dụng C# tôi có thể sử dụng khung .net SqlDataSourceEnumerator để khám phá và hiển thị cho người dùng danh sách các phiên bản SQL Server trên mạng.Liệt kê các máy chủ cơ sở dữ liệu Microsoft SQL trên mạng cục bộ, sử dụng delphi

Tôi làm cách nào để thực hiện điều đó trong Delphi?

+7

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

+0

Tôi thực sự đã sử dụng mã được liên kết của Whiler. Nếu bạn chuyển đổi nhận xét đó thành một câu trả lời và mở rộng nó một chút, tôi sẽ chấp nhận nó. –

+0

Xong ... nhưng như tôi đã nói ... mọi thứ đã được giải thích trên trang của anh ấy và tôi không muốn * ăn cắp * nội dung của anh ấy:/ – Whiler

Trả lời

4

Để liệt kê tất cả có sẵn Microsoft SQL Server, bạn có thể làm theo hướng dẫn tuyệt vời này:

Enumerating available SQL Servers. Retrieving databases on a SQL Server

Trong Zarko 's hướng dẫn , có một liên kết đến download the full source code có thể hữu ích để nhanh chóng kiểm tra và kiểm tra xem nó có phù hợp với y không Những nhu cầu cua chúng ta.

thói quen chính Sửa Žarko Gajic là:

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; 

Tôi không biết những gì tôi có thể thêm mà không lamering gì Žarko của giải thích.

+2

Tôi đã tự do đăng một thói quen cốt lõi (một đoạn trích từ mã thực) bởi vì tôi nghĩ rằng đó là thực hành chấp nhận được ở đây và nói chung trên internet. Không có ý định ở đây để ăn cắp từ Zarko, khen ngợi là Zarkmeister và Uber-About-Delphi-Guy. :-) –

+0

Ok, btw, cảm ơn 'đã được chấp nhận' – Whiler

+0

Thật vậy, các liên kết không còn hoạt động nữa ... –

11

Bạn có thể sử dụng chức năng NetServerEnum, lọc theo giá trị SV_TYPE_SQLSERVER trong thông số máy chủ, một tùy chọn khác là sử dụng đối tượng ADO SQLOLEDB Enumerator.

4

tôi sử dụng mã này:

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

Đừng quên đặt ADODB trong sử dụng – Ravaut123

+0

Và một vài thứ khác. (Thực hiện một điều khoản sử dụng hợp lệ.) –

Các vấn đề liên quan