The following CLI sample, async.c, demonstrates a simple application that runs SQLExecDirect() asynchronously. It is based on the CLI sample program fetch.c.
/* CLI sample async.c */ /* ... */ /* Make the result from SQLGetInfo() more meaningful by mapping */ /* the returned value to the string. */ static char ASYNCMODE[][19] = { "SQL_AM_NONE", "SQL_AM_CONNECTION", "SQL_AM_STATEMENT" }; /* ... */ * See what type of Asynchronous support is available, * and whether or not the CLI/ODBC configuration keyword ASYNCENABLE * is set on or off. */ rc = SQLGetInfo( hdbc, /* Connection handle */ SQL_ASYNC_MODE, /* Query the support available */ &ubuffer, /* Store the result in this variable */ 4, &outlen); CHECK_STMT(hstmt, rc); printf("SQL_ASYNC_MODE value from SQLGetInfo() is %s.\n\n",ASYNCMODE[ubuffer]); if (ubuffer == SQL_AM_NONE ) { /* Async not supported */ printf("Asynchronous execution is not supported by this datasource\n"); printf("or has been turned off by the CLI/ODBC configuration keyword\n"); printf("ASYNCENABLE. The application will continue, but SQLExecDirect()\n"); printf("will not be run asynchronously.\n\n"); /* There is no need to set the SQLSetStmtAttr() option */ } else { /* Set statement level asynchronous execution on */ rc = SQLSetStmtAttr( hstmt, SQL_ATTR_ASYNC_ENABLE, (SQLPOINTER) SQL_ASYNC_ENABLE_ON, 0); CHECK_STMT(hstmt, rc); } /* The while loop is new for the asynchronous sample, the */ /* SQLExecDirect() call remains the same. */ while ((rc = SQLExecDirect(hstmt, sqlstmt, SQL_NTS) ) == SQL_STILL_EXECUTING) { printf(" ...SQLExecDirect() still executing asynchronously...\n"); /* Other processing can be performed here, between each call * to see if SQLExecDirect() has finished running asynchronously. * This section will never run if CLI runs the function * synchronously. */ } CHECK_STMT(hstmt, rc); rc = SQLBindCol(hstmt, 1, SQL_C_CHAR, (SQLPOINTER) deptname.s, 15, &deptname.ind); CHECK_STMT(hstmt, rc); rc = SQLBindCol(hstmt, 2, SQL_C_CHAR, (SQLPOINTER) location.s, 15, &location.ind); CHECK_STMT(hstmt, rc); printf("Departments in Eastern division:\n"); printf("DEPTNAME Location\n"); printf("-------------- -------------\n"); while ((rc = SQLFetch(hstmt)) == SQL_SUCCESS) { printf("%-14.14s %-14.14s \n", deptname.s, location.s); } if (rc != SQL_NO_DATA_FOUND) check_error(henv, hdbc, hstmt, rc, __LINE__, __FILE__); rc = SQLFreeHandle(SQL_HANDLE_STMT, hstmt); CHECK_STMT(hstmt, rc); rc = SQLEndTran(SQL_HANDLE_ENV, henv, SQL_COMMIT); CHECK_DBC(hdbc, rc); printf("Disconnecting .....\n"); rc = SQLDisconnect(hdbc); CHECK_DBC(hdbc, rc); rc = SQLFreeHandle(SQL_HANDLE_DBC, hdbc); CHECK_DBC(hdbc, rc); rc = SQLFreeHandle(SQL_HANDLE_ENV, henv); if (rc != SQL_SUCCESS) return (terminate(henv, rc)); } /* end main */