/* test case */ #include #include #include #include #include #include void CheckRC(SQLRETURN rc, char* msg, char* filename, int lineno); #define CHECKRC(FUNCSHN,MSG) CheckRC(FUNCSHN, MSG, __FILE__, __LINE__) SQLHENV hEnv = SQL_NULL_HENV; SQLHDBC hDbc = SQL_NULL_HDBC; SQLHSTMT hStmt = SQL_NULL_HSTMT; SQLCHAR* connString; SQLCHAR connOut[255]; /* buffer for connection output */ SQLSMALLINT szConnOut; /* num bytes returned in connOut */ SQLINTEGER Version = SQL_OV_ODBC3; void doTest() { char filename[64]; char filedata[65535]; SQLINTEGER len1; SQLINTEGER len2; SQLRETURN retcode; FILE *fd; int readbytes; SQLUSMALLINT RowStatusArray; SQLRETURN rc; printf("Test....\n"); CHECKRC( SQLAllocStmt(hDbc, &hStmt), "SQLAllocStmt()" ); CHECKRC( SQLExecDirect(hStmt, (SQLCHAR*)"USE TEST", SQL_NTS), "SQLExecDirect()" ); SQLSetStmtAttr(hStmt, SQL_ATTR_CURSOR_TYPE, SQL_CURSOR_KEYSET_DRIVEN, 0); SQLSetStmtAttr(hStmt, SQL_ATTR_ROW_BIND_TYPE, SQL_BIND_BY_COLUMN, 0); SQLSetStmtAttr(hStmt, SQL_ATTR_ROW_ARRAY_SIZE, 1, 0); SQLSetStmtAttr(hStmt, SQL_ATTR_ROW_STATUS_PTR, RowStatusArray, 0); CHECKRC( SQLAllocStmt(hDbc, &hStmt), "SQLAllocStmt()" ); retcode = SQLExecDirect(hStmt, "SELECT filename, filedata FROM file_table;", SQL_NTS); //WHERE filename = '' if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { /* Bind columns 1 and 2 */ CHECKRC( SQLBindCol(hStmt, 1, SQL_C_CHAR, &filename, 64, &len1), "SQLBindCol(1)" ); CHECKRC( SQLBindCol(hStmt, 2, SQL_C_CHAR, &filedata, 65535, &len2), "SQLBindCol(2)"); CHECKRC( rc = SQLFetchScroll(hStmt, SQL_FETCH_NEXT, 0), "SQLFetchScroll()"); printf("Old row values %s and %s....\n",filename, filedata); strcpy(filename,"testfile.dat"); printf("Open new.rtf....\n"); fd = fopen(".\\new.rtf", "r"); if (fd != 0) { printf("Load new.rtf....\n"); readbytes = fread(&filedata,sizeof(char),(size_t)65535,fd); printf("Loaded %i bytes....\n",readbytes); printf("Close new.rtf....\n"); fclose(fd); } printf("sql update....\n"); CHECKRC( SQLSetPos(hStmt, 0, SQL_UPDATE, SQL_LOCK_NO_CHANGE), "SQLSetPos()" ); } CHECKRC( SQLFreeStmt(hStmt, SQL_DROP), "SQLFreeStmt()" ); } int main(int argc, char** argv) { int nPrompt = SQL_DRIVER_NOPROMPT; if (argc < 2 || strlen(argv[1]) == 0) { connString = (SQLCHAR *)"DRIVER=MySQL ODBC 3.51 Driver;"; } else connString = (SQLCHAR *)argv[1]; if (SQLAllocEnv(&hEnv) != SQL_SUCCESS) { fprintf(stderr, "Unable to allocate SQLHENV\n"); return(1); } printf("Connect....\n"); SQLAllocEnv(&hEnv); CHECKRC( SQLSetEnvAttr(hEnv,SQL_ATTR_ODBC_VERSION,Version,0 ), "SQLSetEnvAttr()" ); CHECKRC( SQLAllocConnect(hEnv, &hDbc), "SQLAllocConnect()" ); CHECKRC( SQLDriverConnect(hDbc, (HWND)0, connString, SQL_NTS, connOut, 255, &szConnOut, nPrompt), "SQLDriverConnect()" ); doTest(); printf("Disconnect....\n"); CHECKRC( SQLDisconnect(hDbc), "SQLDisconnect()" ); CHECKRC( SQLFreeConnect(hDbc), "SQLFreeConnect()" ); CHECKRC( SQLFreeEnv(hEnv), "SQLFreeEnv()" ); return 0; } void CheckRC(SQLRETURN rc, char* msg, char* filename, int lineno) { #define MSG_LNG 512 SQLCHAR szSqlState[MSG_LNG]; SQLINTEGER pfNativeError; SQLCHAR szErrorMsg[MSG_LNG]; SQLSMALLINT pcbErrorMsg; SQLRETURN ret = SQL_SUCCESS; int error = 0; if (rc != SQL_SUCCESS && rc != SQL_NO_DATA_FOUND) { if (rc != SQL_SUCCESS_WITH_INFO) { fprintf(stderr, "\nERROR (%s:%d): %s\n", filename, lineno, msg); error = 1; } 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: if (rc == SQL_SUCCESS_WITH_INFO) { fprintf(stderr, "\nINFO: (%s:%d): %s\n", filename, lineno, msg); } fprintf(stderr, "*** %s\n*** ODBC Code: %s, " "Driver Code: %ld\n\n", szErrorMsg, szSqlState, pfNativeError); break; case SQL_NO_DATA_FOUND: break; default: fprintf(stderr, "*** SQLError() failed with code=%d\n\n", ret); break; } } } if (error) exit(1); }