#include #include #include #include #define TEXTSIZE 12000 #define MAXBUFLEN 256 SQLHENV henv = SQL_NULL_HENV; SQLHDBC hdbc1 = SQL_NULL_HDBC; SQLHSTMT hstmt1 = SQL_NULL_HSTMT; #define ok_something(A, B, C) rc= B; if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO){ \ error_num= PrintError(C, A, rc); \ goto PROGRAM_END; \ } #define stmt_status(A, B, C) rc= B; if (rc != C){ \ error_num= PrintError(SQL_HANDLE_STMT, A, rc); \ goto PROGRAM_END; \ } #define ok_env(A, B) ok_something(A,B, SQL_HANDLE_ENV) #define ok_dbc(A, B) ok_something(A,B, SQL_HANDLE_DBC) #define ok_stmt(A, B) ok_something(A,B, SQL_HANDLE_STMT) #define ok_sql(A, B) ok_stmt(A, SQLExecDirect(A, B, SQL_NTS)) SQLINTEGER PrintError(SQLSMALLINT handleType, SQLHANDLE handle, SQLRETURN rcode) { SQLRETURN rc = SQL_ERROR; SQLCHAR sqlState[6]; SQLCHAR eMsg[SQL_MAX_MESSAGE_LENGTH]; SQLINTEGER nError; SQLSMALLINT msgLen; if (rcode == SQL_NO_DATA) { printf( "NO DATA .. .. .."); return(SQL_NO_DATA); } else { rc = SQLGetDiagRec(handleType, handle, 1, sqlState, &nError, eMsg, sizeof(eMsg), &msgLen); if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) { printf( " Error: %s\n", eMsg); } return (SQL_ERROR); } } void Cleanup() { if (hstmt1 != SQL_NULL_HSTMT) SQLFreeHandle(SQL_HANDLE_STMT, hstmt1); if (hdbc1 != SQL_NULL_HDBC) { SQLDisconnect(hdbc1); SQLFreeHandle(SQL_HANDLE_DBC, hdbc1); } if (henv != SQL_NULL_HENV) SQLFreeHandle(SQL_HANDLE_ENV, henv); } int main() { RETCODE retcode, rc; int error_num= 0; // SQLBindParameter variables. SQLLEN cbTextSize, lbytes, rcount= 0; // SQLParamData variable. PTR pParmID; // SQLPutData variables. SQLCHAR Data[] = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" "abcdefghijklmnopqrstuvwxyz"; SDWORD cbBatch = (SDWORD)sizeof(Data) - 1; // Allocate the ODBC environment and save handle. ok_env(henv, SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv)); // Notify ODBC that this is an ODBC 3.0 app. ok_env(henv, SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER)); // Allocate ODBC connection handle and connect. ok_env(henv, SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1)); // Sample uses Integrated Security, create SQL Server DSN using Windows NT authentication. ok_dbc(hdbc1, SQLConnect(hdbc1, (SQLCHAR*)"test525w", SQL_NTS, (SQLCHAR*)"",SQL_NTS, (SQLCHAR*)"", SQL_NTS)); // Allocate statement handle. ok_dbc(hdbc1, SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1)); // Execute the command. ok_sql(hstmt1, (SQLCHAR*)"DROP TABLE IF EXISTS emp4"); ok_stmt(hstmt1, SQLFreeStmt(hstmt1, SQL_CLOSE)); ok_sql(hstmt1, (SQLCHAR*)"CREATE TABLE emp4 (NAME char(30), AGE int, BIRTHDAY datetime, Memo1 text)"); ok_stmt(hstmt1, SQLFreeStmt(hstmt1, SQL_CLOSE)); ok_sql(hstmt1, (SQLCHAR*)"INSERT INTO emp4 (NAME, AGE, BIRTHDAY, Memo1) VALUES ('Paul Borm', 46,'1950-11-12 00:00:00', 'abc')"); ok_stmt(hstmt1, SQLFreeStmt(hstmt1, SQL_CLOSE)); // Prepare the command. ok_stmt(hstmt1, SQLPrepare(hstmt1, (SQLCHAR*)"UPDATE emp4 SET Memo1 = ?", SQL_NTS)); // Set parameters based on total data to send. lbytes = (SDWORD)TEXTSIZE; cbTextSize = SQL_LEN_DATA_AT_EXEC(lbytes); // Bind the parameter marker. ok_stmt(hstmt1, SQLBindParameter (hstmt1, // hstmt 1, // ipar SQL_PARAM_INPUT, // fParamType SQL_C_CHAR, // fCType SQL_LONGVARCHAR, // FSqlType lbytes, // cbColDef 0, // ibScale (VOID *)1, // rgbValue 0, // cbValueMax &cbTextSize)); // pcbValue // Execute the command. stmt_status(hstmt1, SQLExecute(hstmt1), SQL_NEED_DATA); // Check to see if NEED_DATA; if yes, use SQLPutData. retcode = SQLParamData(hstmt1, &pParmID); if (retcode == SQL_NEED_DATA) { while (lbytes > cbBatch) { SQLPutData(hstmt1, Data, cbBatch); lbytes -= cbBatch; } // Put final batch. retcode = SQLPutData(hstmt1, Data, lbytes); } if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) { printf("SQLParamData Failed\n\n"); Cleanup(); return(9); } // Make final SQLParamData call. ok_stmt(hstmt1, SQLParamData(hstmt1, &pParmID)); // ----------------- BEGIN --- The piece of code added to MSDN example ok_stmt(hstmt1, SQLRowCount(hstmt1, &rcount)); printf("\n RowCount = %d", rcount); // ------------------ END ---- The piece of code added to MSDN example PROGRAM_END: // Clean up. Cleanup(); SQLFreeHandle(SQL_HANDLE_STMT, hstmt1); SQLDisconnect(hdbc1); SQLFreeHandle(SQL_HANDLE_DBC, hdbc1); SQLFreeHandle(SQL_HANDLE_ENV, henv); }