#include <iostream> #include <cstring>
#if defined(_WIN16) || defined(_WIN32) || defined(_WIN64) #include <windows.h> #endif #include <sqlext.h>
using namespace std;
#define MAX_CONTENT_LEN 2000
SQLHENV henv = SQL_NULL_HENV; SQLHDBC hdbc = SQL_NULL_HDBC; SQLHSTMT hstmt = SQL_NULL_HSTMT;
void Cleanup() { if (hstmt != SQL_NULL_HSTMT) SQLFreeHandle(SQL_HANDLE_STMT, hstmt); if (hdbc != SQL_NULL_HDBC) { SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); } if (henv != SQL_NULL_HENV) SQLFreeHandle(SQL_HANDLE_ENV, henv); }
int main() { SQLRETURN retcode;
retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv); if ((retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) { printf("SQLAllocHandle(Env) Failed\n\n"); Cleanup(); return(9); }
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER); if ((retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) { printf("SQLSetEnvAttr(ODBC version) Failed\n\n"); Cleanup(); return(9); }
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); if ((retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) { printf("SQLAllocHandle(hdbc1) Failed\n\n"); Cleanup(); return(9); }
retcode = SQLConnect(hdbc,(SQLCHAR*)"company",SQL_NTS, NULL, SQL_NTS, NULL, SQL_NTS); if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO)) { printf("SQLConnect() Failed\n\n"); Cleanup(); return(9); }
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO)) { printf("SQLAllocHandle(hstmt1) Failed\n\n"); Cleanup(); return(9); }
retcode = SQLExecDirect(hstmt,(SQLCHAR*)"use test;", SQL_NTS); if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO)) { printf("SQLExecDirect Failed: use test;\n\n"); Cleanup(); return(9); }
uint8_t content[11] = {1, 2, 3, 4, 5, 0, 7, 8, 9, 10}; SQLLEN contentLen = sizeof(content); retcode = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_BINARY, MAX_CONTENT_LEN, 0, content, sizeof(content), &contentLen); if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO)) { printf("SQLBindParameter Failed\n\n"); Cleanup(); return(9); }
const char *stmt = "INSERT INTO msgcontent VALUES(3, ?);"; retcode = SQLExecDirect(hstmt, (SQLCHAR*)stmt, SQL_NTS); if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO)) { printf("SQLExecDirect Failed: %s\n\n", stmt); Cleanup(); return(9); }
SQLUBIGINT id = 3332; memset(content, 0, sizeof(content)); stmt = "SELECT * FROM msgcontent;"; retcode = SQLExecDirect(hstmt, (SQLCHAR*)stmt, SQL_NTS); if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO)) { printf("SQLExecDirect Failed: %s\n\n", stmt); Cleanup(); return(9); } SQLLEN idLen; cout << "id\tcontent\n"; SQLBindCol(hstmt, 1, SQL_C_UBIGINT, &id, sizeof(id), &idLen); SQLBindCol(hstmt, 2, SQL_C_BINARY, content, sizeof(content), &contentLen); while (SQL_NO_DATA != SQLFetch(hstmt)) { cout << id << '\t'; if (SQL_NULL_DATA == contentLen) { cout << "<NULL>"; } else { cout << '(' << contentLen << ')'; for (size_t i = 0; i < contentLen; ++i) { printf("%02x", content[i]); } } cout << endl; }
Cleanup();
return 0; }
|