LOCAL lihEnv,liDSN,liDescript,liDirection,liRet,; lcDsn,lcDescript,lii #DEFINE SQL_FETCH_NEXT 1 #DEFINE SQL_FETCH_FIRST 2 #DEFINE MAX_STRING 128 #DEFINE SQL_SUCCESS 0 #DEFINE SQL_SUCCESS_WITH_INFO 1 #DEFINE SQL_NO_DATA 100 #DEFINE SQL_ERROR (-1) #DEFINE SQL_INVALID_HANDLE (-2) DECLARE INTEGER SQLDrivers IN ODBC32.DLL INTEGER, SHORT ,; STRING @, INTEGER , ; INTEGER @, STRING @, INTEGER , INTEGER @ lihEnv = VAL(SYS(3053))&& The hEnv (converted to a number) liDSN = 0 && How many were actually returned liDescript = 0 && How long the description actually was lii=0 liDirection = SQL_FETCH_FIRST && The first time start at the top liRet = SQL_SUCCESS && Start with no errors DO WHILE (INLIST(liRet,SQL_SUCCESS,SQL_SUCCESS_WITH_INFO)) lcDsn = SPACE(MAX_STRING+1) && Make sure there is enough space lcDescript = SPACE(MAX_STRING+1) liRet = SQLDrivers(lihEnv, liDirection, @lcDSN, MAX_STRING, @liDSN, ; @lcDescript, MAX_STRING, @liDescript) IF liRet = SQL_SUCCESS lii=lii+1 ?LEFT(lcDSN, liDSN),LEFT(lcDescript, liDescript) ENDIF * We only want to do the SQL_FETCH_FIRST the first time liDirection = SQL_FETCH_NEXT ENDDOMartinJ