#ifdef WIN32 #include #endif #include #include SQLTCHAR *DSNPrm= (SQLTCHAR*) "utfdb"; SQLTCHAR *DSNUid= (SQLTCHAR*) ""; SQLTCHAR *DSNPwd= (SQLTCHAR*) ""; char *droptbl = "DROP TABLE IF EXISTS utftest CASCADE"; char *createtbl = "CREATE TABLE utftest(name decimal(20,4))"; #define CHECK_STMT(x) \ if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) \ sqlerrexit(rc,SQL_HANDLE_STMT, x) void sqlerrexit(RETCODE rc, SQLINTEGER type, SQLHANDLE handle) { SQLCHAR SqlState[6], *sq = &SqlState[0]; SQLCHAR Msg[SQL_MAX_MESSAGE_LENGTH], *ms = &Msg[0]; SQLWCHAR SqlStateW[6], *sqw = &SqlStateW[0]; SQLWCHAR MsgW[SQL_MAX_MESSAGE_LENGTH], *msw = &MsgW[0]; SQLINTEGER NativeError; SQLSMALLINT i=1, MsgLen; RETCODE ret; int j; printf("Error number : %d\n", rc); while (SQL_SUCCEEDED(SQLGetDiagRec(type, handle, i++, SqlState, &NativeError, Msg, sizeof(Msg), &MsgLen)) ) { printf("State: %s Native Error Code: %d\n %s (%d)\n", SqlState,NativeError,Msg, MsgLen); } return; } int main(int argc, char **argv) { SQLHENV henv; SQLHDBC hdbc; SQLHSTMT hstmt; SQLCHAR utfstr[80]; SQLLEN lena, lenw; RETCODE rc; if (argc == 2) DSNPrm = argv[1]; else if (argc == 4) { DSNPrm = argv[1]; DSNUid = argv[2]; DSNPwd = argv[3]; } else if ((argc == 3)||(argc > 4)) { printf("usage: ucode [DSN [UserID Password]]\n"); return 1; } SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv); SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER); SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); SQLConnect(hdbc, DSNPrm, SQL_NTS, DSNUid, SQL_NTS, DSNPwd, SQL_NTS); SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); rc = SQLExecDirect(hstmt, (SQLCHAR*)droptbl, SQL_NTS); CHECK_STMT(hstmt); rc = SQLExecDirect(hstmt, (SQLCHAR*)createtbl, SQL_NTS); CHECK_STMT(hstmt); SQLPrepare(hstmt, "insert into utftest(name) values (?)", SQL_NTS); strcpy(utfstr, "44.47"); lenw = strlen(utfstr) * sizeof(SQLCHAR); rc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_WCHAR, SQL_WLONGVARCHAR, 0, 0, utfstr, 0, &lenw); CHECK_STMT(hstmt); rc = SQLExecute(hstmt); CHECK_STMT(hstmt); /* commit the transaction */ rc= SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_COMMIT); CHECK_STMT(hstmt); SQLFreeHandle(SQL_HANDLE_STMT, hstmt); SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); SQLFreeHandle(SQL_HANDLE_ENV, henv); }