#include
#include
#include
#include
#include
#include
#include
void CheckReturnCode(SQLRETURN rc, SQLHENV henv,SQLHDBC hdbc, SQLHSTMT hstmt,char* msg, char *filename, int lineno);
void main( void )
{
SQLRETURN rc = SQL_SUCCESS; /* General return code for the API */
SQLHENV hEnv = SQL_NULL_HENV; /* Environment handle */
SQLHDBC hDbc = SQL_NULL_HDBC; /* Connection handle */
SQLHSTMT hStmt = SQL_NULL_HSTMT; /* Statement handle */
//SQLCHAR *szConnString = (SQLCHAR *)"DSN=TT41Data";
SQLCHAR *szConnString = (SQLCHAR *)"dsn=ttdatasvr;tcp_port=14502;uid=spa;pwd=a$h$e$01";
SQLCHAR szConnOut[255]; /* Buffer for completed connection string */
SQLSMALLINT cbConnOut; /* number of bytes returned in szConnOut */
// allocate environment
rc = SQLAllocEnv(&hEnv);
if (rc != SQL_SUCCESS) {
fprintf(stderr,"Unable to allocate an environment handle/n");
exit(1);
}
// allocate connection
rc = SQLAllocConnect(hEnv, &hDbc);
CheckReturnCode(rc, hEnv, SQL_NULL_HDBC, SQL_NULL_HSTMT, "Unable allocate connection handle/n", __FILE__, __LINE__);
rc = SQLDriverConnect(hDbc, /
NULL, /
(SQLCHAR *)szConnString,/
SQL_NTS, /
szConnOut, /
255, /
&cbConnOut, /
SQL_DRIVER_NOPROMPT);
CheckReturnCode(rc, hEnv, hDbc, SQL_NULL_HSTMT, "Error in connecting to the driver/n",__FILE__, __LINE__);
// allocate statement
rc = SQLAllocStmt(hDbc, &hStmt);
CheckReturnCode(rc, hEnv, hDbc, SQL_NULL_HSTMT, "Unable to allocate a statement handle/n", __FILE__,__LINE__);
/* Your application code here */
//SQLINTEGER v3;
SQLCHAR v1[256];
SQLLEN v1size;
SQLCHAR v2[256];
SQLLEN v2size;
SQLCHAR v3[256];
SQLLEN v3size;
SQLLEN numOfRows;
//int whereValue=1;
SQLINTEGER whereValue=1;
SQLCHAR sqlString[] = "select v1,v2 from tab where v3=?";
rc = SQLPrepare( hStmt, (SQLCHAR*)sqlString, SQL_NTS );
CheckReturnCode(rc, hEnv, hDbc, hStmt, "Unable to SQLPrepare./n", __FILE__, __LINE__);
// bind parameter
memset((void *)v3, 0, (255) );
strcpy((char *)v3,"123");
rc = SQLBindParameter(
hStmt,
1, /* ParameterNumber, start 1 */
SQL_PARAM_INPUT, /* InputOutputType */
SQL_C_CHAR, /* ValueType: C data type of the parameter */
SQL_CHAR, /* ParameterType: SQL data type of the parameter */
sizeof(v3), /* ColumnSize: Precision of the corresponding parameter marker */
0, /* DecimalDigits:scale of the corresponding parameter */
(v3), /* ParameterValuePtr */
sizeof(v3), /* BufferLength, valid for char */
&v3size); /* StrLen_or_IndPtr */
CheckReturnCode(rc, hEnv, hDbc, hStmt, "Unable to SQLBindParameter 1/n", __FILE__, __LINE__);
// bind column
rc= SQLBindCol(hStmt,(SQLSMALLINT)1, SQL_C_CHAR, (v1), sizeof(v1), &v1size);
CheckReturnCode(rc, hEnv, hDbc, hStmt, "Unable to free the statement handle/n", __FILE__, __LINE__);
rc= SQLBindCol(hStmt,(SQLSMALLINT)2, SQL_C_CHAR, (v2), sizeof(v2), &v2size);
CheckReturnCode(rc, hEnv, hDbc, hStmt, "Unable to free the statement handle/n", __FILE__, __LINE__);
// Execute
rc = SQLExecute(hStmt);
CheckReturnCode(rc, hEnv, hDbc, hStmt, "Unable to SQLExecute/n", __FILE__, __LINE__);
// Fetch
rc = SQLFetch(hStmt);
CheckReturnCode(rc, hEnv, hDbc, hStmt, "Unable to SQLFetch./n", __FILE__, __LINE__);
rc = SQLFreeStmt(hStmt,SQL_CLOSE);
CheckReturnCode(rc, hEnv, hDbc, hStmt, "Unable to execute update SQL sentence./n", __FILE__, __LINE__);
/*******************************************************************************/
if (hStmt != SQL_NULL_HSTMT) {
rc = SQLFreeStmt(hStmt, SQL_DROP);
CheckReturnCode(rc, hEnv, hDbc, hStmt, "Unable to free the statement handle/n", __FILE__, __LINE__);}
if (hDbc != SQL_NULL_HDBC) {
rc = SQLDisconnect(hDbc);
CheckReturnCode(rc, hEnv, hDbc,SQL_NULL_HSTMT,"Unable to close the connection/n",__FILE__, __LINE__);
rc = SQLFreeConnect(hDbc);
CheckReturnCode(rc, hEnv, hDbc,SQL_NULL_HSTMT,"Unable to free the connection handle/n",__FILE__, __LINE__);
}
if (hEnv != SQL_NULL_HENV) {
rc = SQLFreeEnv(hEnv);
CheckReturnCode(rc, hEnv, SQL_NULL_HDBC,SQL_NULL_HSTMT,"Unable free environment handle/n",__FILE__, __LINE__);
}
}
void CheckReturnCode(SQLRETURN rc, SQLHENV henv,SQLHDBC hdbc, SQLHSTMT hstmt,char* msg, char *filename,int lineno)
{
#define MSG_LNG 512
SQLCHAR szSqlState[MSG_LNG]; /* SQL state string */
SQLINTEGER pfNativeError; /* Native error code */
SQLCHAR szErrorMsg[MSG_LNG]; /* Error msg text buffer pointer */
SQLSMALLINT pcbErrorMsg; /* Error msg text Available bytes */
SQLRETURN ret = SQL_SUCCESS;
if (rc != SQL_SUCCESS && rc != SQL_NO_DATA_FOUND && rc != SQL_SUCCESS_WITH_INFO ) {
if (rc != SQL_SUCCESS_WITH_INFO) { /* It's not just a warning */
fprintf(stderr, "*** ERROR in %s, line %d: %s/n",filename, lineno, msg);
}
/*
* Now see why the error/warning occurred
*/
while (ret == SQL_SUCCESS ||ret == SQL_SUCCESS_WITH_INFO) {
ret = SQLError(henv, hdbc, hstmt,szSqlState, &pfNativeError,szErrorMsg, MSG_LNG,&pcbErrorMsg);
switch (ret) {
case SQL_SUCCESS:
fprintf(stderr, "*** %s/n*** ODBC Error/Warning = %s, TimesTen Error/Warning = %d/n",szErrorMsg, szSqlState,pfNativeError);
break;
case SQL_SUCCESS_WITH_INFO:
fprintf(stderr, "*** Call to SQLError failed with return code of SQL_SUCCESS_WITH_INFO./n *** Need to increase size of message buffer./n");
break;
case SQL_INVALID_HANDLE:
fprintf(stderr, "*** Call to SQLError failed with return code of SQL_INVALID_HANDLE./n");
break;
case SQL_ERROR:
fprintf(stderr, "*** Call to SQLError failed with return code of SQL_ERROR./n");
break;
case SQL_NO_DATA_FOUND:
printf("SQL_NO_DATA_FOUND/n");
break;
default:
fprintf(stderr, "*** Call to SQLError failed with return code of UNKNOW./n");
break;
} /* switch */
} /* while */
exit(1);
}
}