Example of using suffix-W APIs
You can use suffix-W APIs to handle application encoding schemes.
The following example shows an example ODBC application that uses
three suffix-W APIs to handle a Unicode UCS-2 application encoding
scheme. Figure 1. An application that uses suffix-W
APIs
/******************************************************************/
/* Main program */
/* - CREATE MYTABLE */
/* - INSERT INTO MYTABLE using literals */
/* - INSERT INTO MYTABLE using parameter markers */
/* - SELECT FROM MYTABLE with WHERE clause */
/* */
/* suffix-W APIS used: */
/* - SQLConnectW */
/* - SQLPrepareW */
/* - SQLExecDirectW */
/******************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <wstr.h>
#include "sqlcli1.h"
#include <stlca.h>
#include <errno.h>
#include <sys/_messag.h>
#pragma convlit(suspend)
SQLHENV henv = SQL_NULL_HENV;
SQLHDBC hdbc = SQL_NULL_HDBC;
SQLHSTMT hstmt = SQL_NULL_HSTMT;
SQLRETURN rc = SQL_SUCCESS;
SQLINTEGER id;
SQLSMALLINT scale;
SQLCHAR server[18]
SQLCHAR uid[30]
SQLCHAR pwd[30]
SQLSMALLINT pcpar=0;
SQLSMALLINT pccol=0;
SQLCHAR sqlstmt[200]
SQLINTEGER sqlstmtlen;
SQLWCHAR H1INT4 [50]
SQLWCHAR H1SMINT [50]
SQLWCHAR H1CHR10 [50]
SQLWCHAR H1CHR10MIX [50]
SQLWCHAR H1VCHR20 [50]
SQLWCHAR H1VCHR20MIX [50]
SQLWCHAR H1GRA10 [50]
SQLWCHAR H1VGRA20 [50]
SQLWCHAR H1TTIME [50]
SQLWCHAR H1DDATE [50]
SQLWCHAR H1TSTMP [50]
SQLWCHAR H2INT4 [50]
SQLWCHAR H2SMINT [50]
SQLWCHAR H2CHR10 [50]
SQLWCHAR H2CHR10MIX [50]
SQLWCHAR H2VCHR20 [50]
SQLWCHAR H2VCHR20MIX [50]
SQLWCHAR H2GRA10 [50]
SQLWCHAR H2VGRA20 [50]
SQLWCHAR H2TTIME [50]
SQLWCHAR H2DDATE [50]
SQLWCHAR H2TSTMP [50]
SQLINTEGER LEN_H1INT4;
SQLINTEGER LEN_H1SMINT;
SQLINTEGER LEN_H1CHR10;
SQLINTEGER LEN_H1CHR10MIX;
SQLINTEGER LEN_H1VCHR20;
SQLINTEGER LEN_H1VCHR20MIX;
SQLINTEGER LEN_H1GRA10;
SQLINTEGER LEN_H1VGRA20;
SQLINTEGER LEN_H1TTIME;
SQLINTEGER LEN_H1DDATE;
SQLINTEGER LEN_H1TSTMP;
SQLINTEGER LEN_H2INT4;
SQLINTEGER LEN_H2SMINT;
SQLINTEGER LEN_H2CHR10;
SQLINTEGER LEN_H2CHR10MIX;
SQLINTEGER LEN_H2VCHR20;
SQLINTEGER LEN_H2VCHR20MIX;
SQLINTEGER LEN_H2GRA10;
SQLINTEGER LEN_H2VGRA20;
SQLINTEGER LEN_H2TTIME;
SQLINTEGER LEN_H2DDATE;
SQLINTEGER LEN_H2TSTMP;
SQLWCHAR DROPW1 [100]
SQLWCHAR DELETEW1[100]
SQLWCHAR SELECTW1[100]
SQLWCHAR CREATEW1[500]
SQLWCHAR INSERTW1[500]
SQLWCHAR DROPW2 [100]
SQLWCHAR DELETEW2[100]
SQLWCHAR SELECTW2[100]
SQLWCHAR CREATEW2[500]
SQLWCHAR INSERTW2[500]
SQLINTEGER LEN_H1INT4;
SQLINTEGER LEN_DROPW1;
SQLINTEGER LEN_DELETEW1;
SQLINTEGER LEN_INSERTW1;
SQLINTEGER LEN_CREATEW1;
SQLINTEGER LEN_SELECTW1;
SQLINTEGER LEN_DROPW2;
SQLINTEGER LEN_DELETEW2;
SQLINTEGER LEN_INSERTW2;
SQLINTEGER LEN_CREATEW2;
SQLINTEGER LEN_SELECTW2;
struct {
short LEN;
char DATA&lbracket;200&rbracket;; } STMTSQL;
long SPCODE;
int result;
int ix, locix;
/******************************************************************/
int main()
{
henv=0;
rc=SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
if( rc != SQL_SUCCESS ) goto dberror;
hdbc=0;
rc=SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
if( rc != SQL_SUCCESS ) goto dberror;
/*****************************************************************/
/* Setup application host variables (UCS-2 character strings) */
/*****************************************************************/
#pragma convlit(resume)
wcscpy(uid, (wchar_t *)"jgold");
wcscpy(pwd, (wchar_t *)"general");
wcscpy(server, (wchar_t *)"STLEC1");
wcscpy(DROPW1, (wchar_t *)
"DROP TABLE MYTABLE");
LEN_DROPW1=wcslen((wchar_t *)DROPW1);
wcscpy(SELECTW1, (wchar_t *)
"SELECT * FROM MYTABLE WHERE INT4=200");
LEN_SELECTW1=wcslen((wchar_t *)SELECTW1);
wcscpy(CREATEW1, (wchar_t *)
"CREATE TABLE MYTABLE ( ");
wcscat(CREATEW1, (wchar_t *)
"INT4 INTEGER, SMINT SMALLINT, ");
wcscat(CREATEW1, (wchar_t *)
"CHR10 CHAR(10), CHR10MIX CHAR(10) FOR MIXED DATA, ");
wcscat(CREATEW1, (wchar_t *)
"VCHR20 VARCHAR(20), VCHR20MIX VARCHAR(20) FOR MIXED DATA, ");
wcscat(CREATEW1, (wchar_t *)
"GRA10 GRAPHIC(10), VGRA20 VARGRAPHIC(20), ");
wcscat(CREATEW1, (wchar_t *)
"TTIME TIME, DDATE DATE, TSTMP TIMESTAMP )" );
LEN_CREATEW1=wcslen((wchar_t *)CREATEW1);
wcscpy(DELETEW1, (wchar_t *)
"DELETE FROM MYTABLE WHERE INT4 IS NULL OR INT4 IS NOT NULL");
LEN_DELETEW1=wcslen((wchar_t *)DELETEW1);
wcscpy(INSERTW1, (wchar_t *)
"INSERT INTO MYTABLE VALUES ( ");
wcscat(INSERTW1, (wchar_t *)
"( 100,1,'CHAR10','CHAR10MIX','VARCHAR20','VARCHAR20MIX', ");
wcscat(INSERTW1, (wchar_t *)
"G' A B C', VARGRAPHIC('ABC'), ");
wcscat(INSERTW1, (wchar_t *)
"'3:45 PM', '06/12/1999', ");
wcscat(INSERTW1, (wchar_t *)
"'1999-09-09-09.09.09.090909' )" );
LEN_INSERTW1=wcslen((wchar_t *)INSERTW1);
wcscpy(INSERTW2, (wchar_t *)
"INSERT INTO MYTABLE VALUES (?,?,?,?,?,?,?,?,?,?,?)");
LEN_INSERTW2=wcslen((wchar_t *)INSERTW2);
wcscpy(H1INT4 , (wchar_t *)"200");
wcscpy(H1SMINT , (wchar_t *)"5");
wcscpy(H1CHR10 , (wchar_t *)"CHAR10");
wcscpy(H1CHR10MIX , (wchar_t *)"CHAR10MIX");
wcscpy(H1VCHR20 , (wchar_t *)"VARCHAR20");
wcscpy(H1VCHR20MIX, (wchar_t *)"VARCHAR20MIX");
wcscpy(H1TTIME , (wchar_t *)"3:45 PM");
wcscpy(H1DDATE , (wchar_t *)"06/12/1999");
wcscpy(H1TSTMP , (wchar_t *)"1999-09-09-09.09.09.090909");
#pragma convlit(suspend)
/* 0xFF21,0xFF22,0xFF23,0x0000 */
wcscpy(H1GRA10 , (wchar_t *)" ");
/* 0x0041,0xFF21,0x0000 */
wcscpy(H1VGRA20 , (wchar_t *)" ");
LEN_H1INT4 = SQL_NTS;
LEN_H1SMINT = SQL_NTS;
LEN_H1CHR10 = SQL_NTS;
LEN_H1CHR10MIX = SQL_NTS;
LEN_H1VCHR20 = SQL_NTS;
LEN_H1VCHR20MIX = SQL_NTS;
LEN_H1GRA10 = SQL_NTS;
LEN_H1VGRA20 = SQL_NTS;
LEN_H1TTIME = SQL_NTS;
LEN_H1DDATE = SQL_NTS;
LEN_H1TSTMP = SQL_NTS;
/*****************************************************************/
/* SQLConnectW */
/*****************************************************************/
rc=SQLConnectW(hdbc, NULL, 0, NULL, 0, NULL, 0);
if( rc != SQL_SUCCESS ) goto dberror;
/*****************************************************************/
/* DROP TABLE - SQLExecuteDirectW */
/*****************************************************************/
hstmt=0;
rc=SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if( rc != SQL_SUCCESS ) goto dberror;
rc=SQLExecDirectW(hstmt,DROPW1,SQL_NTS);
if( rc != SQL_SUCCESS ) goto dberror;
rc=SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_COMMIT);
if( rc != SQL_SUCCESS ) goto dberror;
rc=SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
if( rc != SQL_SUCCESS ) goto dberror;
/*****************************************************************/
/* CREATE TABLE MYTABLE - SQLPrepareW */
/*****************************************************************/
hstmt=0;
rc=SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if( rc != SQL_SUCCESS ) goto dberror;
rc=SQLPrepareW(hstmt,CREATEW1,SQL_NTS);
if( rc != SQL_SUCCESS) goto dberror;
rc=SQLExecute(hstmt);
if( rc != SQL_SUCCESS ) goto dberror;
rc=SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_COMMIT);
if( rc != SQL_SUCCESS ) goto dberror;
rc=SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
if( rc != SQL_SUCCESS ) goto dberror;
/*****************************************************************/
/* INSERT INTO MYTABLE with literals - SQLExecDirectW */
/*****************************************************************/
hstmt=0;
rc=SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if( rc != SQL_SUCCESS ) goto dberror;
rc=SQLExecDirectW(hstmt,DROPW1,SQL_NTS);
if( rc != SQL_SUCCESS) goto dberror;
rc=SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_COMMIT);
if( rc != SQL_SUCCESS) goto dberror;
rc=SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
if( rc != SQL_SUCCESS) goto dberror;
/*****************************************************************/
/* INSERT INTO MYTABLE with parameter markers */
/* - SQLPrepareW */
/* - SQLBindParameter with SQL_C_WCHAR symbolic C data type */
/*****************************************************************/
hstmt=0;
rc=SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if( rc != SQL_SUCCESS ) goto dberror;
/* INSERT INTO MYTABLE VALUES (?,?,?,?,?,?,?,?,?,?,?) */
rc=SQLPrepareW(hstmt,INSERTW2,SQL_NTS);
if( rc != SQL_SUCCESS ) goto dberror;
rc=SQLNumParams(hstmt, &pcpar);
if( rc != SQL_SUCCESS) goto dberror;
printf("\nAPDV1 number= 19");
if( pcpar != 11 ) goto dberror;
/* Bind INTEGER parameter */
rc= SQLBindParameter(hstmt,
1,
SQL_PARAM_INPUT,
SQL_C_WCHAR,
SQL_INTEGER,
10,
0,
(SQLPOINTER)H1INT4,
sizeof(H1INT4
), (SQLINTEGER *)&LEN_H1INT4 );
if( rc != SQL_SUCCESS) goto dberror;
/* Bind SMALLINT parameter */
rc = SQLBindParameter(hstmt,
2,
SQL_PARAM_INPUT,
SQL_C_WCHAR,
SQL_SMALLINT,
5,
0,
(SQLPOINTER)H1SMINT,
sizeof(H1SMINT),
(SQLINTEGER*)&LEN_H1SMINT);
if( rc != SQL_SUCCESS ) goto dberror;
/* Bind CHAR(10) parameter */
rc = SQLBindParameter(hstmt,
3,
SQL_PARAM_INPUT,
SQL_C_WCHAR,
SQL_CHAR,
10,
0,
(SQLPOINTER)H1CHR10,
sizeof(H1CHR10),
(SQLINTEGER *)&LEN_H1CHR10);
if( rc != SQL_SUCCESS ) goto dberror;
/* Bind CHAR(10) parameter */
rc = SQLBindParameter(hstmt,
3,
SQL_PARAM_INPUT,
SQL_C_WCHAR,
SQL_CHAR,
10,
0,
(SQLPOINTER)H1CHR10,
sizeof(H1CHR10),
(SQLINTEGER *)&LEN_H1CHR10);
if( rc != SQL_SUCCESS ) goto dberror;
/* Bind CHAR(10) FOR MIXED parameter */
rc = SQLBindParameter(hstmt,
4,
SQL_PARAM_INPUT,
SQL_C_WCHAR,
SQL_CHAR,
10,
0,
(SQLPOINTER)H1CHR10MIX,
sizeof(H1CHR10MIX),
(SQLINTEGER *)&LEN_H1CHR10MIX);
if( rc != SQL_SUCCESS ) goto dberror;
/* Bind VARCHAR(20) parameter */
rc = SQLBindParameter(hstmt,
5,
SQL_PARAM_INPUT,
SQL_C_WCHAR,
SQL_VARCHAR,
20,
0,
(SQLPOINTER)H1VCHR20,
sizeof(H1VCHR20),
(SQLINTEGER *)&LEN_H1VCHR20);
if( rc != SQL_SUCCESS ) goto dberror;
/* Bind VARCHAR(20) FOR MIXED parameter */
rc = SQLBindParameter(hstmt,
6,
SQL_PARAM_INPUT,
SQL_C_WCHAR,
SQL_VARCHAR,
20,
0,
(SQLPOINTER)H1VCHR20MIX,
sizeof(H1VCHR20MIX),
(SQLINTEGER *)&LEN_H1VCHR20MIX);
if( rc != SQL_SUCCESS ) goto dberror;
/* Bind GRAPHIC(10) parameter */
rc = SQLBindParameter(hstmt,
7,
SQL_PARAM_INPUT,
SQL_C_WCHAR,
SQL_GRAPHIC,
10,
0,
(SQLPOINTER)H1GRA10,
sizeof(H1GRA10),
(SQLINTEGER *)&LEN_H1GRA10);
if( rc != SQL_SUCCESS ) goto dberror;
/* Bind VARGRAPHIC(20) parameter*/
rc = SQLBindParameter(hstmt,
8,
SQL_PARAM_INPUT,
SQL_C_WCHAR,
SQL_VARGRAPHIC,
20,
0,
(SQLPOINTER)H1VGRA20,
sizeof(H1VGRA20),
(SQLINTEGER *)&LEN_H1VGRA20);
if( rc != SQL_SUCCESS ) goto dberror;
/* Bind TIME parameter */
rc= SQLBindParameter(hstmt,
9,
SQL_PARAM_INPUT,
SQL_C_WCHAR,
SQL_TIME,
8,
0,
(SQLPOINTER)H1TTIME,
sizeof(H1TTIME),
(SQLINTEGER *)&LEN_H1TTIME);
if( rc != SQL_SUCCESS) goto dberror;
/* Bind DATE parameter */
rc = SQLBindParameter(hstmt,
10,
SQL_PARAM_INPUT,
SQL_C_WCHAR,
SQL_DATE,
10,
0,
(SQLPOINTER)H1DDATE,
sizeof(H1DDATE),
(SQLINTEGER *)&LEN_H1DDATE);
if( rc != SQL_SUCCESS ) goto dberror;
/* Bind TIMESTAMP parameter */
rc = SQLBindParameter(hstmt,
11
SQL_PARAM_INPUT,
SQL_C_WCHAR,
SQL_DATE,
26,
0,
(SQLPOINTER)H1TSTMP,
sizeof(H1TSTMP),
(SQLINTEGER *)&LEN_H1TSTMP);
if( rc != SQL_SUCCESS ) goto dberror;
printf("\nAPDV1 SQLExecute number= 25");
rc=SQLExecute(hstmt);
if( rc != SQL_SUCCESS) goto dberror;
printf("\nAPDV1 SQLEndTran number=26");
rc=SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_COMMIT);
if( rc != SQL_SUCCESS ) goto dberror;
printf("\nAPDV1 SQLFreeHandle(SQL_HANDLE_STMT, ...) number= 27");
rc=SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
if( rc != SQL_SUCCESS ) goto dberror;
/*****************************************************************/
/* SELECT FROM MYTABLE WHERE INT4=200 */
/* - SQLBindCol with SQL_C_WCHAR symbolic C data type */
/* - SQLExecDirectW */
/*****************************************************************/
hstmt=0;
rc=SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if( rc != SQL_SUCCESS ) goto dberror;
/* Bind INTEGER column */
rc = SQLBindCol(hstmt,
1,
SQL_C_WCHAR,
(SQLPOINTER)H2INT4,
sizeof(H2INT4 ),
(SQLINTEGER *)&LEN_H2INT4 );
if( rc != SQL_SUCCESS ) goto dberror;
/* Bind SMALLINT column */
rc = SQLBindCol(hstmt,
2,
SQL_C_WCHAR,
(SQLPOINTER)H2SMINT,
sizeof(H2SMINT),
(SQLINTEGER *)&LEN_H2SMINT);
if( rc != SQL_SUCCESS ) goto dberror;
/* Bind CHAR(10) column */
rc = SQLBindCol(hstmt,
3,
SQL_C_WCHAR,
(SQLPOINTER)H2CHR10,
sizeof(H2CHR10),
(SQLINTEGER *)&LEN_H2CHR10);
if( rc != SQL_SUCCESS ) goto dberror;
/* Bind CHAR(10) FOR MIXED column */
rc = SQLBindCol(hstmt,
4,
SQL_C_WCHAR,
(SQLPOINTER)H2CHR10MIX,
sizeof(H2CHR10MIX),
(SQLINTEGER *)&LEN_H2CHR10MIX);
if( rc != SQL_SUCCESS ) goto dberror;
/* Bind VARCHAR(20) column */
rc = SQLBindCol(hstmt,
5,
SQL_C_WCHAR,
(SQLPOINTER)H2VCHR20,
sizeof(H2VCHR20,
(SQLINTEGER *)&LEN_H2VCHR20);
if( rc != SQL_SUCCESS ) goto dberror;
/* Bind VARCHAR(20) FOR MIXED column */
rc = SQLBindCol(hstmt,
6,
SQL_C_WCHAR,
(SQLPOINTER)H2VCHR20MIX,
sizeof(H2VCHR20MIX),
(SQLINTEGER *)&LEN_H2VCHR20MIX);
if( rc != SQL_SUCCESS ) goto dberror;
/* Bind GRAPHIC(10) column */
rc = SQLBindCol(hstmt,
7,
SQL_C_WCHAR,
(SQLPOINTER)H2GRA10,
sizeof(H2GRA10),
(SQLINTEGER *)&LEN_H2GRA10);
if( rc != SQL_SUCCESS ) goto dberror;
/* Bind VARGRAPHIC(20) column */
rc = SQLBindCol(hstmt,
8,
SQL_C_WCHAR,
(SQLPOINTER)H2VGRA20,
sizeof(H2VGRA20),
(SQLINTEGER *)&LEN_H2VGRA20);
if( rc != SQL_SUCCESS ) goto dberror;
/* Bind TIME column */
rc = SQLBindCol(hstmt,
9,
SQL_C_WCHAR,
(SQLPOINTER)H2TTIME,
sizeof(H2TTIME),
(SQLINTEGER *)&LEN_H2TTIME);
if( rc != SQL_SUCCESS ) goto dberror;
/* Bind DATE column */
rc = SQLBindCol(hstmt,
10,
SQL_C_WCHAR,
(SQLPOINTER)H2DDATE,
sizeof(H2DDATE),
(SQLINTEGER *)&LEN_H2DDATE);
if( rc != SQL_SUCCESS ) goto dberror;
/* Bind TIMESTAMP column */
rc = SQLBindCol(hstmt,
11,
SQL_C_WCHAR,
(SQLPOINTER)H2TSTMP,
sizeof(H2TSTMP),
(SQLINTEGER *)&LEN_H2TSTMP);
if( rc != SQL_SUCCESS ) goto dberror;
/*
* SELECT * FROM MYTABLE WHERE INT4=200
*/
rc=SQLExecDirectW(hstmt,SELECTW1,SQL_NTS);
if( rc != SQL_SUCCESS ) goto dberror;
rc=SQLFetch(hstmt);
if( rc != SQL_SUCCESS ) goto dberror;
rc=SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
if( rc != SQL_SUCCESS ) goto dberror;
/*****************************************************************/
rc=SQLDisconnect(hdbc);
if( rc != SQL_SUCCESS ) goto dberror;
rc=SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
if( rc != SQL_SUCCESS ) goto dberror;
rc=SQLFreeHandle(SQL_HANDLE_ENV, henv);
if( rc != SQL_SUCCESS ) goto dberror;
dberror:
rc = SQL_ERROR;
return(rc);
} /*END MAIN*/