Example: Calling Db2 for i CLI functions in an PASE for i program
This example shows an PASE for i program that accesses Db2® for i using the Db2 for i SQL call level interfaces.
Note: By using the code examples, you agree to the terms
of the Code license and disclaimer information.
/* i5/OS PASE DB2 for i5/OS example program
*
* To show an example of an PASE for i program that accesses
* DB2 for i via SQL CLI
*
* Program accesses System i Access database, QIWS/QCUSTCDT, that
* should exist on all systems
*
* Change system name, userid, and password in fun_Connect()
* procedure to valid parms
*
* Compilation invocation:
*
* xlc -I./include -bI:./include/libdb400.exp -o paseclidb4 paseclidb4.c
*
* FTP in binary, run from QP2TERM() terminal shell
*
* Output should show all rows with a STATE column match of MN */
/* Change Activity: */
/* End Change Activity */
#define SQL_MAX_UID_LENGTH 10
#define SQL_MAX_PWD_LENGTH 10
#define SQL_MAX_STM_LENGTH 255
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlcli.h"
SQLRETURN fun_Connect( void );
SQLRETURN fun_DisConnect( void );
SQLRETURN fun_ReleaseEnvHandle( void );
SQLRETURN fun_ReleaseDbcHandle( void );
SQLRETURN fun_ReleaseStmHandle( void );
SQLRETURN fun_Process( void );
SQLRETURN fun_Process2( void );
void fun_PrintError( SQLHSTMT );
SQLRETURN nml_ReturnCode;
SQLHENV nml_HandleToEnvironment;
SQLHDBC nml_HandleToDatabaseConnection;
SQLHSTMT nml_HandleToSqlStatement;
SQLINTEGER Nmi_vParam;
SQLINTEGER Nmi_RecordNumberToFetch = 0;
SQLCHAR chs_SqlStatement01[ SQL_MAX_STM_LENGTH + 1 ];
SQLINTEGER nmi_PcbValue;
SQLINTEGER nmi_vParam;
char *pStateName = "MN";
void main( ) {
static
char*pszId = "main()";
SQLRETURN nml_ConnectionStatus;
SQLRETURN nml_ProcessStatus;
nml_ConnectionStatus = fun_Connect();
if ( nml_ConnectionStatus == SQL_SUCCESS ) {
printf( "%s: fun_Connect() succeeded\n", pszId );
} else {
printf( "%s: fun_Connect() failed\n", pszId );
exit( -1 );
} /* endif */
printf( "%s: Perform query\n", pszId );
nml_ProcessStatus = fun_Process();
printf( "%s: Query complete\n", pszId );
nml_ConnectionStatus = fun_DisConnect();
if ( nml_ConnectionStatus == SQL_SUCCESS ) {
printf( "%s: fun_DisConnect() succeeded\n", pszId );
} else {
printf( "%s: fun_DisConnect() failed\n", pszId );
exit( -1 );
} /* endif */
printf( "%s: normal exit\n", pszId );
} /* end main */
SQLRETURN fun_Connect()
{
static char *pszId = "fun_Connect()";
SQLCHAR chs_As400System[ SQL_MAX_DSN_LENGTH ];
SQLCHAR chs_UserName[ SQL_MAX_UID_LENGTH ];
SQLCHAR chs_UserPassword[ SQL_MAX_PWD_LENGTH ];
nml_ReturnCode = SQLAllocEnv( &nml_HandleToEnvironment );
if ( nml_ReturnCode != SQL_SUCCESS ) {
printf( "%s: SQLAllocEnv() succeeded\n", pszId );
fun_PrintError( SQL_NULL_HSTMT );
printf( "%s: Terminating\n", pszId );
return SQL_ERROR;
} else {
printf( "%s: SQLAllocEnv() succeeded\n", pszId );
} /* endif */
strcpy( chs_As400System, "AS4PASE" );
strcpy( chs_UserName, "QUSER" );
strcpy( chs_UserPassword, "QUSER" );
printf( "%s: Connecting to %s userid %s\n", pszId, chs_As400System, chs_UserName );
nml_ReturnCode = SQLAllocConnect( nml_HandleToEnvironment,
&nml_HandleToDatabaseConnection );
if ( nml_ReturnCode != SQL_SUCCESS ) {
printf( "%s: SQLAllocConnect\n", pszId );
fun_PrintError( SQL_NULL_HSTMT );
nml_ReturnCode = fun_ReleaseEnvHandle();
printf( "%s: Terminating\n", pszId );
return SQL_ERROR;
} else {
printf( "%s: SQLAllocConnect() succeeded\n", pszId );
} /* endif */
nml_ReturnCode = SQLConnect( nml_HandleToDatabaseConnection,
chs_As400System,
SQL_NTS,
chs_UserName,
SQL_NTS,
chs_UserPassword,
SQL_NTS );
if ( nml_ReturnCode != SQL_SUCCESS ) {
printf( "%s: SQLConnect(%s) failed\n", pszId, chs_As400System );
fun_PrintError( SQL_NULL_HSTMT );
nml_ReturnCode = fun_ReleaseDbcHandle();
nml_ReturnCode = fun_ReleaseEnvHandle();
printf( "%s: Terminating\n", pszId );
return SQL_ERROR;
} else {
printf( "%s: SQLConnect(%s) succeeded\n", pszId, chs_As400System );
return SQL_SUCCESS;
} /* endif */
} /* end fun_Connect */
SQLRETURN fun_Process()
{
static
char*pszId = "fun_Process()";
charcLastName[ 80 ];
nml_ReturnCode = SQLAllocStmt( nml_HandleToDatabaseConnection,
&nml_HandleToSqlStatement );
if ( nml_ReturnCode != SQL_SUCCESS ) {
printf( "%s: SQLAllocStmt() failed\n", pszId );
fun_PrintError( SQL_NULL_HSTMT );
printf( "%s: Terminating\n", pszId );
return SQL_ERROR;
} else {
printf( "%s: SQLAllocStmt() succeeded\n", pszId );
} /* endif */
strcpy( chs_SqlStatement01, "select LSTNAM, STATE " );
strcat( chs_SqlStatement01, "from QIWS.QCUSTCDT " );
strcat( chs_SqlStatement01, "where " );
strcat( chs_SqlStatement01, "STATE = ? " );
nml_ReturnCode = SQLPrepare( nml_HandleToSqlStatement,
chs_SqlStatement01,
SQL_NTS );
if ( nml_ReturnCode != SQL_SUCCESS ) {
printf( "%s: SQLPrepare() failed\n", pszId );
fun_PrintError( nml_HandleToSqlStatement );
nml_ReturnCode = fun_ReleaseStmHandle();
printf( "%s: Terminating\n", pszId );
return SQL_ERROR;
} else {
printf( "%s: SQLPrepare() succeeded\n", pszId );
} /* endif */
Nmi_vParam = SQL_TRUE;
nml_ReturnCode = SQLSetStmtOption( nml_HandleToSqlStatement,
SQL_ATTR_CURSOR_SCROLLABLE,
( SQLINTEGER * ) &Nmi_vParam );
if ( nml_ReturnCode != SQL_SUCCESS ) {
printf( "%s: SQLSetStmtOption() failed\n", pszId );
fun_PrintError( nml_HandleToSqlStatement );
nml_ReturnCode = fun_ReleaseStmHandle();
printf( "%s: Terminating\n", pszId );
return SQL_ERROR;
} else {
printf( "%s: SQLSetStmtOption() succeeded\n", pszId );
} /* endif */
Nmi_vParam = SQL_TRUE;
nml_ReturnCode = SQLSetStmtOption( nml_HandleToSqlStatement,
SQL_ATTR_FOR_FETCH_ONLY,
( SQLINTEGER * ) &Nmi_vParam );
if ( nml_ReturnCode != SQL_SUCCESS ) {
printf( "%s: SQLSetStmtOption() failed\n", pszId );
fun_PrintError( nml_HandleToSqlStatement );
nml_ReturnCode = fun_ReleaseStmHandle();
printf( "%s: Terminating\n", pszId );
return SQL_ERROR;
} else {
printf( "%s: SQLSetStmtOption() succeeded\n", pszId );
} /* endif */
nmi_PcbValue = 0;
nml_ReturnCode = SQLBindParam( nml_HandleToSqlStatement,
1,
SQL_CHAR,
SQL_CHAR,
2,
0,
( SQLPOINTER ) pStateName,
( SQLINTEGER *) &nmi_PcbValue );
if ( nml_ReturnCode != SQL_SUCCESS ) {
printf( "%s: SQLBindParam() failed\n", pszId );
fun_PrintError( nml_HandleToSqlStatement );
nml_ReturnCode = fun_ReleaseStmHandle();
printf( "%s: Terminating\n", pszId );
return SQL_ERROR;
} else {
printf( "%s: SQLBindParam() succeeded\n", pszId );
} /* endif */
nml_ReturnCode = SQLExecute( nml_HandleToSqlStatement );
if ( nml_ReturnCode != SQL_SUCCESS ) {
printf( "%s: SQLExecute() failed\n", pszId );
fun_PrintError( nml_HandleToSqlStatement );
nml_ReturnCode = fun_ReleaseStmHandle();
printf( "%s: Terminating\n", pszId );
return SQL_ERROR;
} else {
printf( "%s: SQLExecute() succeeded\n", pszId );
} /* endif */
nml_ReturnCode = SQLBindCol( nml_HandleToSqlStatement,
1,
SQL_CHAR,
( SQLPOINTER ) &cLastName,
( SQLINTEGER ) ( 8 ),
( SQLINTEGER * ) &nmi_PcbValue );
if ( nml_ReturnCode != SQL_SUCCESS ) {
printf( "%s: SQLBindCol() failed\n", pszId );
fun_PrintError( nml_HandleToSqlStatement );
nml_ReturnCode = fun_ReleaseStmHandle();
printf( "%s: Terminating\n", pszId );
return SQL_ERROR;
} else {
printf( "%s: SQLBindCol() succeeded\n", pszId );
} /* endif */
do {
memset( cLastName, '\0', sizeof( cLastName ) );
nml_ReturnCode = SQLFetchScroll( nml_HandleToSqlStatement,
SQL_FETCH_NEXT,
Nmi_RecordNumberToFetch );
if ( nml_ReturnCode == SQL_SUCCESS ) {
printf( "%s: SQLFetchScroll() succeeded, LastName(%s)\n", pszId, cLastName);
} else {
}/*endif */
} while ( nml_ReturnCode == SQL_SUCCESS );
if ( nml_ReturnCode != SQL_NO_DATA_FOUND ) {
printf( "%s: SQLFetchScroll() failed\n", pszId );
fun_PrintError( nml_HandleToSqlStatement );
nml_ReturnCode = fun_ReleaseStmHandle();
printf( "%s: Terminating\n", pszId );
return SQL_ERROR;
} else {
printf( "%s: SQLFetchScroll() completed all rows\n", pszId );
} /* endif */
nml_ReturnCode = SQLCloseCursor( nml_HandleToSqlStatement );
if ( nml_ReturnCode != SQL_SUCCESS ) {
printf( "%s: SQLCloseCursor() failed\n", pszId );
fun_PrintError( nml_HandleToSqlStatement );
nml_ReturnCode = fun_ReleaseStmHandle();
printf( "%s: Terminating\n", pszId );
return SQL_ERROR;
} else {
printf( "%s: SQLCloseCursor() succeeded\n", pszId );
} /* endif */
return SQL_SUCCESS;
} /* end fun_Process */
SQLRETURN fun_DisConnect()
{
static
char*pszId = "fun_DisConnect()";
nml_ReturnCode = SQLDisconnect( nml_HandleToDatabaseConnection );
if ( nml_ReturnCode != SQL_SUCCESS ) {
printf( "%s: SQLDisconnect() failed\n", pszId );
fun_PrintError( SQL_NULL_HSTMT );
printf( "%s: Terminating\n", pszId );
return 1;
} else {
printf( "%s: SQLDisconnect() succeeded\n", pszId );
} /* endif */
nml_ReturnCode = fun_ReleaseDbcHandle();
nml_ReturnCode = fun_ReleaseEnvHandle();
return nml_ReturnCode;
} /* end fun_DisConnect */
SQLRETURN fun_ReleaseEnvHandle()
{
static
char*pszId = "fun_ReleaseEnvHandle()";
nml_ReturnCode = SQLFreeEnv( nml_HandleToEnvironment );
if ( nml_ReturnCode != SQL_SUCCESS ) {
printf( "%s: SQLFreeEnv() failed\n", pszId );
fun_PrintError( SQL_NULL_HSTMT );
return SQL_ERROR;
} else {
printf( "%s: SQLFreeEnv() succeeded\n", pszId );
return SQL_SUCCESS;
} /* endif */
} /* end fun_ReleaseEnvHandle */
SQLRETURN fun_ReleaseDbcHandle()
{
static
char*pszId = "fun_ReleaseDbcHandle()";
nml_ReturnCode = SQLFreeConnect( nml_HandleToDatabaseConnection );
if ( nml_ReturnCode != SQL_SUCCESS ) {
printf( "%s: SQLFreeConnect() failed\n", pszId );
fun_PrintError( SQL_NULL_HSTMT );
return SQL_ERROR;
} else {
printf( "%s: SQLFreeConnect() succeeded\n", pszId );
return SQL_SUCCESS;
} /* endif */
} /* end fun_ReleaseDbcHandle */
SQLRETURN fun_ReleaseStmHandle()
{
static
char*pszId = "fun_ReleaseStmHandle()";
nml_ReturnCode = SQLFreeStmt( nml_HandleToSqlStatement, SQL_CLOSE );
if ( nml_ReturnCode != SQL_SUCCESS ) {
printf( "%s: SQLFreeStmt() failed\n", pszId );
fun_PrintError( nml_HandleToSqlStatement );
return SQL_ERROR;
} else {
printf( "%s: SQLFreeStmt() succeeded\n", pszId );
return SQL_SUCCESS;
} /* endif */
} /* end fun_ReleaseStmHandle */
void fun_PrintError( SQLHSTMT nml_HandleToSqlStatement )
{
static
char*pszId = "fun_PrintError()";
SQLCHAR chs_SqlState[ SQL_SQLSTATE_SIZE ];
SQLINTEGER nmi_NativeErrorCode;
SQLCHAR chs_ErrorMessageText[ SQL_MAX_MESSAGE_LENGTH + 1 ];
SQLSMALLINT nmi_NumberOfBytes;
nml_ReturnCode = SQLError( nml_HandleToEnvironment,
nml_HandleToDatabaseConnection,
nml_HandleToSqlStatement,
chs_SqlState,
&nmi_NativeErrorCode,
chs_ErrorMessageText,
sizeof( chs_ErrorMessageText ),
&nmi_NumberOfBytes );
if ( nml_ReturnCode != SQL_SUCCESS ) {
printf( "%s: SQLError() failed\n", pszId );
return;
} /* endif */
printf( "%s: SqlState - %s\n", pszId, chs_SqlState );
printf( "%s: SqlCode - %d\n", pszId, nmi_NativeErrorCode );
printf( "%s: Error Message:\n", pszId );
printf( "%s: %s\n", pszId, chs_ErrorMessageText );
} /* end fun_PrintError */