/**********************************************************************
* FILENAME :        ListTables.c
*
* DESCRIPTION :
*       Simple example to list the tables available on a datasource
*
* ODBC USAGE :
* 		SQLTables        - to request TABLE names
*		SQLNumResultCols - to get number of columns in the rowset
*		For each table
*			SQLFetch     - fetches the next rowset
*			SQLGetData   - for each column in the rowset display
*                                      - Catalog, Schema, Table, Type, Remarks in
*                                        tabular form
*/
#include <stdio.h>
#include <stdlib.h>
#include <sql.h>
#include <sqlext.h>
#include <string.h>

#include "util.c"

int main () {

    // For formatting output
    char padding[] = "                                                        ";
    int max=strlen(padding);

    SQLHENV  henv  = SQL_NULL_HENV; // Environment handle
    SQLHDBC  hdbc  = SQL_NULL_HDBC; // Connection handle
    SQLHSTMT hstmt = SQL_NULL_HSTMT;// Statement handle
    SQLRETURN retcode;				// Return status

	SQLSMALLINT columns; 			// Number of columns in result-set

	// Allocate an environment handle
	retcode=SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
        CHECK_ERROR(retcode, "SQLAllocHandle(ENV)", henv, SQL_HANDLE_ENV);

	// Set ODBC version
	retcode=SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
                                        (void *) SQL_OV_ODBC3, 0);
        CHECK_ERROR(retcode, "SQLSetEnvAttr(SQL_ATTR_ODBC_VERSION)",
                    henv, SQL_HANDLE_ENV);

	// Allocate a connection handle
	retcode=SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
       CHECK_ERROR(retcode, "SQLAllocHandle(SQL_HANDLE_DBC)",
                   hdbc, SQL_HANDLE_DBC);

	// DSN
	retcode=SQLDriverConnect(hdbc, NULL, "DSN=DATASOURCE;",
                                SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);
        CHECK_ERROR(retcode, "SQLDriverConnect(DATASOURCE)",
                    hdbc, SQL_HANDLE_DBC);

	// Allocate a statement handle
	retcode=SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
        CHECK_ERROR(retcode, "SQLAllocHandle(SQL_HANDLE_STMT)",
                    hstmt, SQL_HANDLE_STMT);

	// Retrieve a list of tables
	retcode=SQLTables(hstmt, NULL, 0, NULL, 0, NULL, 0, "TABLE", SQL_NTS);
        CHECK_ERROR(retcode, "SQLTables()", hstmt, SQL_HANDLE_STMT);

	// How many columns are there
	retcode=SQLNumResultCols(hstmt, &columns);
        CHECK_ERROR(retcode, "SQLNumResultCols()",
                    hstmt, SQL_HANDLE_STMT);

	printf ("\nCatalog Schema  Table                                 ");
        printf ("                  Type   Remarks");
	printf ("\n------- ------- ------                                ");
        printf ("                  ----   -------\n");

	/* Loop through the rows in the result-set */
	while (SQL_SUCCEEDED(retcode = SQLFetch(hstmt))) {
	    SQLUSMALLINT i;

	    // Loop through the columns
		printf ("\n");
	    for (i = 1; i <= columns; i++) {
	        SQLLEN  indicator;
	        SQLCHAR buf[255];
	        // Retrieve column data as a string
			retcode = SQLGetData(hstmt, i, SQL_C_CHAR,
                                        buf, sizeof(buf), &indicator);
			if (SQL_SUCCEEDED(retcode)) {
			    // Handle null columns
			    if (indicator == SQL_NULL_DATA) strcpy (buf, "NULL");

				// Column 3 is the table name
				if (i==3)
					padOut (buf, padding, max);
				else
					padOut (buf, padding, 8);

		        printf("%s%s", buf, padding);
			}
		}
	}

exit:

    printf ("\nComplete.\n");

    // Free handles
    // Statement
    if (hstmt != SQL_NULL_HSTMT)
        SQLFreeHandle(SQL_HANDLE_STMT, hstmt);

    // Connection
    if (hdbc != SQL_NULL_HDBC) {
        SQLDisconnect(hdbc);
        SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    }

    // Environment
    if (henv != SQL_NULL_HENV)
        SQLFreeHandle(SQL_HANDLE_ENV, henv);

    return 0;
}

Further information