Get several ways to get lists of SQL Server Server

zhaozj2021-02-17  49

Get several ways to get lists of SQL Server Server

First, SQL DMO

Description: SQL Distributed Management Objects (SQL Distributed Management Object), exists in the sqldmo.dll file, actually a COM object, obtained by calling the ListAvailableSqlServers method of SQL DMO.

List Type: Enumerates a computer with "client" and "server".

Applicable conditions: With SQL Server, there are SQLDMo.dll files.

Speed:

Call example: getsqlserverlist (listbox1.items);

Code:

Uses

Comobj;

Function GetsqlServerList (VAR Alist: Tstrings): Boolean;

VAR

SQLSERVERAPP: Variant;

ServerList: Variant;

i: integer;

Begin

RESULT: = TRUE;

Try

SQLSerVerapp: = CreateoleObject ('sqldmo.application');

ServerList: = SQLSERVERAPP.ListavailableSqlServers;

For i: = 1 to ServerList.count DO

Alist.add (ServerList.Item (i));

SQLSERVERAPPP: = UNASSIGNED;

ServerList: = UNASSIGNED;

Except

Result: = FALSE;

END;

END;

Second, NetServereNum

Description: Network service function, existing in the NetApi32.dll file; get a list of computer with the SQL Server server through the NetServereNum function, and only the computer with the SQL Server client will not be listed; if a computer's SQL Server The service just started, then this function will take the computer for a long time.

List type: Only a computer with "server" is listed.

Applicable conditions: There are Netapi32.dll files.

high speed

Call example: getsqlserverlist (listbox1.items);

Code:

Type

NET_API_STATUS = DWORD;

PSERVERINFO100 = ^ TSERVERINFO100;

_Server_info_100 = Record

SV100_PLATFORM_ID: DWORD;

SV100_NAME: LPWSTR;

END;

{$ Extealsym _server_info_100}

TSERVERINFO100 = _SERVER_INFO_100;

Server_INFO_100 = _SERVER_INFO_100;

{$ ExternalSym Server_INFO_100}

Const

Nerr_success = 0;

MAX_PREFERRED_LENGTH = DWORD (-1);

SV_TYPE_SQLSERVER = $ 00000004;

Function NetapiFFeralLocate (Bytecount: DWORD; VAR BUFFER: POINTER):

NET_API_STATUS; stdcall; external 'Netapi32.dll' Name 'Netapibuff &Buff &BuffRoccate'; Function NetServereNum (ServerName: lpcwstr; Level: DWORD; var BUFPTR: POINTER

PREFMAXLEN: DWORD; VAR ENTRIESREAD: DWORD; VAR TOTALENTRIES: DWORD

Servertype: DWORD; DOMAIN: LPCWSTR; ResumeHandle: PDWORD: NET_API_STATUS;

STDCALL; External 'Netapi32.dll' Name 'NetServereNum';

Function NetapiFFERFree (Buffer: Pointer): NET_API_STATUS; stdcall; External

'Netapi32.dll' Name 'Netapibufferfree';

Function GetsqlServerList (VAR Alist: Tstrings; PWCServerName: pwchar = nil;

PWCDOMAIN: PWCHAR = NIL): boolean;

VAR

Netapistatus: DWORD;

DWLEVEL: DWORD;

PRETURnsVRINFO: POINTER;

DWPREFMAXLEN: DWORD;

DWENTRIESREAD: DWORD;

DWTOTALENTRIES: DWORD;

DWSERVERTYPE: DWORD;

DWRESUMEHANDLE: PDWORD;

PCURSVRINFO: PSERVERINFO100;

I, J: Integer;

Begin

RESULT: = TRUE;

Try

DWLEVEL: = 100;

PRETURnsvrinfo: = nil;

DWPREFMAXLEN: = max_preferred_length;

DWENTRIESREAD: = 0;

DWTOTALENTRIES: = 0;

DWSERVERTYPE: = SV_TYPE_SQLSERVER; // Server type

DWRESUMEHANDLE: = NIL;

NetapibufferalLocate (SizeOf (Preturnsvrinfo), Preturnsvrinfo;

Try

NetaPistatus: = netserverenum (PWCserverName, dwlevel, preturnsvrinfo,

DWPREFMAXLEN, DWENTRIESREAD, DWTOTALENTRIES, DWSERVERTYPE, PWCDOMAIN,

dwresumehandle;

IF (NetApistatus = Nerr_Success) or (NetaPistatus = Error_More_Data)) and

(preturnsvrinfo <> nil) THEN

Begin

Pcursvrinfo: = PRETURNSVRINFO;

// Loop acquire all SQL Server servers

I: = 0;

J: = DWENTRIESREAD;

While i

Begin

IF pcursvrinfo = nil dam

Break;

WITH ALIST DO

Add (pcursvrinfo ^ .sv100_name);

INC (I);

INC; PCURSVRINFO;

END;

END;

Finally

IF Assigned (Preturnsvrinfo) THEN

Netapibufferfree (PRETURnsVRINFO);

END;

Except

Result: = FALSE;

END;

END;

Third, SQLBROWSECONNECT

Description: ODBC function (Microsoft Open Database Connectivity, open database connection), exists in the odbc32.dll file; returns to the connection string information through the SQLBROWSECONNECT function, including DSN, Driver, Server, UID, PWD, App, WSID, DATABASE , Language and other information. In the function getoDBCINFO, ITSERVER, ITDATABASE, ITLANGUAGE can obtain information lists such as "Server", "Database", "Language", where ITDATABASE, ITLANGUAGE defaults to local information, take remote information, please modify "DRIVER = {SQL" Server}; server = (local); UID = SA; PWD = 'connection string.

List Type: Enumerates a computer with "client" and "server".

Applicable conditions: Due to MDAC 2.6, 2.6 SP1, 2.7 and Microsoft ODBC Driver For SQL Server 2000 2000.80.194 has bugs, this function cannot obtain Microsoft SQL Server 7.0 servers in these versions.

Speed:

Call example: getoDBCINFO (ListBox1.Items, ITSERVER);

Code:

Type

Tinfotype = (Itserver, ITDATABASE, ITLANGUAGE);

SQLHANDLE = POINTER;

Sqlsmallint = short;

SQLINTEGER = Longint;

Psqlhandle = ^ SQLHANDLE;

Sqlhenv = SQLHANDLE;

SQLHDBC = SqlHandle;

SQLRETURN = SQLSMALLINT;

Sqlchar = uchar;

Psqlchar = ^ SQLCHAR;

Sqlpointer = POINTER;

Psqlsmallint = ^ Sqlsmallint;

Function SQLallochandle (Handletype: Sqlsmallint; InputHandle: SqlHandle;

OutputHandle: psqlhandle: SQLRETURN; stdcall; external 'odbc32.dll' Name

'Sqlallochandle';

Function SQLSETENVATTR (EnvironmentHandle: SQLhenV; Attribute: Sqlinteger;

Value: SQLPointer; StringLength: SQLINTEGER: SQLRETURN; stdcall; External

'odbc32.dll' name 'sqlsetenvattr';

Function SQLBROWSECONNECT (HDBC: SQLHDBC; SZConnstrin: psqlchar;

CBConnstrin: sqlsmallint; szconnstrout: psqlchar;

CBConnStrOMax: Sqlsmallint; pcbconnstrout: psqlsmallint): Sqlreturn; stdcall; external 'odbc32.dll' name 'sqlbrowseconnect';

Function Sqldisconnect (ConnectionHandle: SQLHDBC): SQLRETURN; stdcall; External

'odbc32.dll' name 'sqldisconnect';

Function SQLFreeHandle (Handletype: Sqlsmallint; Handle: SQLHANDLE): SQLRETURN;

STDCALL; External 'odbc32.dll' name 'sqlfreehandle';

Const

SQL_HANDLE_ENV = 1;

SQL_HANDLE_DBC = 2;

SQL_NULL_HANDLE = longint (0);

SQL_SUCCESS = 0;

SQL_ERROR = -1;

SQL_ATTR_ODBC_VERSION = 200;

SQL_OV_ODBC3 = ULONG (3);

SQL_NTS = -3;

Function Get 2BCINFO (VAR Alist: Tstrings; Infotype: Tinfotype): Boolean

Const

ConnStrOMax = 4824;

Splitterstr = '= {';

VAR

Henv: sqlhenv;

HDBC: SQLHDBC;

Retcode: sqlreturn;

Connstrout: psqlchar;

CBConnSTrout: sqlsmallint;

Connstrin, TMPSTR: STRING

TMPPOS: Integer;

Begin

Case Infotype of

ITSERVER: CONNSTIN: = 'Driver = {SQL Server}'

ITDATABASE, ITLANGUAGE: Connstrin: = 'driver = {SQL Server}; server = (local); UID = SA; PWD =';

END;

Result: = FALSE;

Try

// Assign an ODBC environment handle

Retcode: = sqlallochandle (SQL_HANDLE_ENV, SQLPOINTER (SQL_NULL_HANDLE), @henv);

if retcode = SQL_ERROR THEN

EXIT;

/ / Set ODBC version

Retcode: = SQLSETENVATTR (HENV, SQL_ATTR_ODBC_VERSION, SQLPOINTER (SQL_OV_ODBC3), 0);

IF RETCODE <> SQL_SUCCESS THEN

EXIT;

// Assign database connection handle

Retcode: = sqlallochandle (SQL_HANDLE_DBC, HENV, @HDBC);

IF RETCODE <> SQL_SUCCESS THEN

EXIT;

GetMem (Connstrout, ConnStrOMax);

Retcode: = SQLBROWSECONNECT (HDBC, Psqlchar (Connstrin), SQL_NTS, ConnStrout, ConnStrOMax, @cbconnstrout;

IF RETCODE <> SQL_ERROR THEN

Begin

Tmpstr: = pchar (connStrout);

IF infictype = itlanguage the

DELETE (Tmpstr, 1, ANSIPOS ('};', tmpstr) 1);

DELETE (Tmpstr, 1, ANSIPOS (Splitterstr, Tmpstr) 1);

Delete (Tmpstr, Ansipos ('}', tmpstr), Length (Tmpstr));

While Tmpstr <> 'DO

Begin

TMPPOS: = ANSIPOS (', "TMPSTR);

IF TMPPOS> 0 THEN

Alist.add (Copy (Tmpstr, 1, TMPPOS - 1))

Else

Begin

Alist.Add (Tmpstr);

Tmpstr: = '';

END;

Delete (Tmpstr, 1, TMPOS)

END;

RESULT: = TRUE;

END;

FreeMem (ConnStrout, ConnStroutmax);

Finally

IF assigned (hdbc) THEN

Begin

Sqldisconnect (HDBC);

SQLFreeHandle (SQL_HANDLE_DBC, HDBC);

HDBC: = NIL;

END;

IF assigned (henv) THEN

Begin

SQLFreeHandle (SQL_HANDLE_ENV, HENV);

Henv: = NIL;

END;

END;

END;

Zhang Wei (alan) alan@cnvcl.org

转载请注明原文地址:https://www.9cbs.com/read-28885.html

New Post(0)