2012-05-15 16 views
10

Si estaba usando C#, podría usar SqlDataSourceEnumerator de .net framework para descubrir y mostrar a un usuario una lista de instancias de SQL Server en la red.Enumerar servidores de base de datos Microsoft SQL en la red local, usando delphi

¿Cómo puedo hacer eso en Delphi?

+7

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

+0

De hecho, utilicé el código vinculado de Whiler. Si convierte ese comentario a una respuesta y lo expande un poquito, lo aceptaré. –

+0

Hecho ... pero como dije ... todo está explicado en su página y no quiero * robar * su contenido:/ – Whiler

Respuesta

4

Para enumerar todos los servidores SQL Server de Microsoft disponibles, puede seguir este excelente tutorial:

Enumerating available SQL Servers. Retrieving databases on a SQL Server

Incluido en Zarko 's tutorial , hay un enlace a download the full source code que puede ser útil para probarlo rápidamente y comprobar si cabe nuestras necesidades.

rutina principal de Editar Zarko Gajic es:

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; 

no sé qué más puedo añadir, sin lamering lo Zarko de explicarse.

+2

Me tomé la libertad de publicar una rutina básica (un fragmento del código real) porque creo que es una práctica aceptable aquí y generalmente en Internet. No intento robarle a Zarko, alabado sea el Zarkmeister y Uber-About-Delphi-Guy. :-) –

+0

Ok, btw, gracias por el "aceptado" – Whiler

+0

De hecho, los enlaces ya no funcionan ... –

4

utilizo este código:

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

No olvides configurar ADODB en los usos – Ravaut123

+0

Y algunos otros. (Se creó una cláusula de usos válidos). –

Cuestiones relacionadas