CREATE CURSOR c_Servers; (cServerName C(100))
LPARAMETERS tcCursor * Populate collection with available SQL servers #DEFINE SQL_HANDLE_ENV 1 #DEFINE SQL_HANDLE_DBC 2 #DEFINE SQL_ATTR_ODBC_VERSION 200 #DEFINE SQL_OV_ODBC3 3 #DEFINE SQL_SUCCESS 0 #DEFINE SQL_NEED_DATA 99 #DEFINE DEFAULT_RESULT_SIZE 2048 #DEFINE SQL_DRIVER_STR "DRIVER=SQL SERVER"; LOCAL hEnv LOCAL hConn LOCAL cInString LOCAL cOutString LOCAL nLenOutString LOCAL ARRAY aServerList[1] DECLARE SHORT SQLBrowseConnect IN odbc32 ; INTEGER ConnectionHandle, ; STRING InConnectionString, ; INTEGER StringLength1, ; STRING @ OutConnectionString, ; INTEGER BufferLength, ; INTEGER @ StringLength2Ptr DECLARE SHORT SQLAllocHandle IN odbc32 ; INTEGER HandleType, ; INTEGER InputHandle, ; INTEGER @ OutputHandlePtr DECLARE SHORT SQLFreeHandle IN odbc32 ; INTEGER HandleType, ; INTEGER Handle DECLARE SHORT SQLSetEnvAttr IN odbc32 ; INTEGER EnvironmentHandle, ; INTEGER ATTRIBUTE, ; INTEGER ValuePtr, ; INTEGER StringLength hEnv = 0 hConn = 0 cInString = SQL_DRIVER_STR cOutString = SPACE(DEFAULT_RESULT_SIZE) nLenOutString = 0 ZAP IN (m.tcCursor) TRY IF SQLAllocHandle(SQL_HANDLE_ENV, hEnv, @hEnv) == SQL_SUCCESS IF (SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3, 0)) == SQL_SUCCESS IF SQLAllocHandle(SQL_HANDLE_DBC, hEnv, @hConn) == SQL_SUCCESS IF (SQLBrowseConnect(hConn, @cInString, LEN(cInString), @cOutString, DEFAULT_RESULT_SIZE, @nLenOutString)) == SQL_NEED_DATA nCnt = ALINES(aServerList, STREXTRACT(cOutString, '{', '}'), .T., ',') FOR i = 1 TO nCnt *!* oServerCollection.AddEntity(aServerList[i]) INSERT INTO (m.tcCursor) (cServerName) VALUES (RTRIM(aServerList[i])) ENDFOR ENDIF ENDIF ENDIF ENDIF CATCH TO oException * ignore error, just return an empty collection of servers MESSAGEBOX(oException.Message, 0+16, _screen.caption) FINALLY IF hConn <> 0 SQLFreeHandle(SQL_HANDLE_DBC, hConn) ENDIF IF hEnv <> 0 SQLFreeHandle(SQL_HANDLE_ENV, hConn) ENDIF ENDTRY>How can I return a list of SQL servers in VFP?