/* cc -Wall -I${IODBC}/include -L${IODBC}/lib csqlbug.c -o csqlbug -liodbc */ #include #include #include "sql.h" #include "sqlext.h" #define NBROW 5 #define ISOK(m,rc) if(rc!=SQL_SUCCESS) { printf("Failed on %s\n",m); exit(1); } #define CSTR "mysql" int main() { HENV henv; HDBC hdbc; HSTMT hstmt; int rc; SQLINTEGER data_in[NBROW]={1,2,3,4,5}; SQLLEN intInd[NBROW]= {4,4,4,4,4}; SQLULEN nbrow; SQLINTEGER rts; SQLLEN len; SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); rc=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,0); ISOK("HENV",rc) rc=SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); ISOK("DBC",rc) rc=SQLConnect(hdbc,(SQLCHAR *)CSTR,SQL_NTS, NULL, 0, NULL, 0); ISOK("connect",rc) rc=SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); ISOK("newstat",rc) rc=SQLExecDirect(hstmt,(SQLCHAR *)"DROP TABLE IF EXISTS sqlbug",SQL_NTS); ISOK("drop",rc) rc=SQLExecDirect(hstmt,(SQLCHAR *)"CREATE TABLE sqlbug (id INTEGER)",SQL_NTS); ISOK("newtable",rc) rc=SQLSetStmtAttr(hstmt,SQL_ATTR_PARAMSET_SIZE,(SQLPOINTER)NBROW,0); ISOK("paramset",rc) rc=SQLSetStmtAttr(hstmt,SQL_ATTR_PARAMS_PROCESSED_PTR,&nbrow,0); ISOK("nbrow",rc) rc=SQLBindParameter(hstmt,1,SQL_PARAM_INPUT,SQL_C_LONG,SQL_INTEGER,0,0,data_in,0,intInd); ISOK("bind",rc) nbrow=0; rc=SQLExecDirect(hstmt,(SQLCHAR *)"INSERT INTO sqlbug (id) VALUES (?)",SQL_NTS); ISOK("insert",rc) printf("Inserted: %d (should be 5)\n",(int)nbrow); SQLSetStmtAttr(hstmt,SQL_ATTR_PARAMSET_SIZE,(SQLPOINTER)1,0); SQLSetStmtAttr(hstmt,SQL_ATTR_PARAMS_PROCESSED_PTR,NULL,0); rc=SQLExecDirect(hstmt,(SQLCHAR *)"SELECT COUNT(*) FROM sqlbug",SQL_NTS); ISOK("count",rc) rc=SQLFetch(hstmt); ISOK("fetch",rc) rc=SQLGetData(hstmt,1,SQL_C_SLONG,&rts,sizeof(SQLINTEGER),&len); ISOK("getdata",rc) printf("rts=%d (should be 5) len=%d (should be 4)\n",(int)rts,(int)len); SQLFreeHandle(SQL_HANDLE_STMT, hstmt); SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); SQLFreeHandle(SQL_HANDLE_ENV, henv); return 0; }