How To Retrieving a List of All ODBC Data Sources (119064)



The information in this article applies to:

  • The Microsoft Foundation Classes (MFC), when used with:
    • Microsoft Visual C++ for Windows, 16-bit edition 1.5
    • Microsoft Visual C++ for Windows, 16-bit edition 1.51
    • Microsoft Visual C++ for Windows, 16-bit edition 1.52
    • Microsoft Visual C++, 32-bit Editions 2.0
    • Microsoft Visual C++, 32-bit Editions 2.1
    • Microsoft Visual C++, 32-bit Editions 2.2
    • Microsoft Visual C++, 32-bit Editions 4.0
    • Microsoft Visual C++, 32-bit Editions 4.1
    • Microsoft Visual C++, 32-bit Editions 4.2
    • Microsoft Visual C++, 32-bit Editions 5.0
    • Microsoft Visual C++, 32-bit Editions 6.0
  • Microsoft Data Access Components 1.5
  • Microsoft Data Access Components 2.0
  • Microsoft Data Access Components 2.1
  • Microsoft Data Access Components 2.5
  • Microsoft Data Access Components 2.6
  • Microsoft Data Access Components 2.7

This article was previously published under Q119064

SUMMARY

The Open Database Connectivity (ODBC) API contains a function called SQLDataSources() which can be used to retrieve information about data sources which are available to an application. Below is a sample function which fills a CStringList with the names of all available ODBC data sources.

Sample Code

   #include <afxcoll.h>    //Needed for CStringList MFC class.
   #include "odbcinst.h"
   #include "sql.h"
   #include "sqlext.h"

   // NOTE: in 16-bit Visual C++ link with odbcinst.lib
   //       in 32-bit Visual C++ 2.x link with odbccp32.lib
   //       in 32-bit Visual C++ 4.x no need to change link options

   #define MAX_DSN_LENGTH 30
   #define MAX_DSN_DESC_LENGTH 300

   BOOL GetODBCDataSourceNames(CStringList * pList)
   {
       HENV hEnv;
       char szDSN[MAX_DSN_LENGTH];
       SWORD cbDSN;
       UCHAR szDescription[MAX_DSN_DESC_LENGTH];
       SWORD cbDescription;
       RETCODE retcode;

       ASSERT(pList->IsEmpty());
       if (SQLAllocEnv(&hEnv)!=SQL_SUCCESS)
           return FALSE;

       while (retcode=SQLDataSources(hEnv, SQL_FETCH_NEXT,
                    (UCHAR FAR *) &szDSN, MAX_DSN_LENGTH, &cbDSN,
                    (UCHAR FAR *) &szDescription,MAX_DSN_DESC_LENGTH,
                     &cbDescription) != SQL_NO_DATA_FOUND
                    &&retcode!=SQL_ERROR)

          {
               pList->AddTail(szDSN);
          }

       SQLFreeEnv(hEnv);
       if (retcode==SQL_ERROR)
         return FALSE;

       return TRUE;
   }
				

Modification Type:MinorLast Reviewed:7/15/2004
Keywords:kbcode kbDatabase kbhowto kbProgramming KB119064