Quantcast
Channel: MySQL Forums - Connector/C++
Viewing all articles
Browse latest Browse all 527

I'm using c++ with prepared db (no replies)

$
0
0
#include <iostream> #include <windows.h> #include <sql.h> #include <sqlext.h> #include <string> #include <cstring> #include"stdafx.h" // Constants #define MAX_NAME_SIZE 256 #define OSUCCESS 0 #define OFAILURE -1 // Global variables SQLHENV m_SqlEnv = NULL; // ODBC environment handle SQLHDBC m_SqlConn = NULL; // ODBC connection handle SQLHSTMT m_SqlStmt = NULL; // ODBC statement handle bool m_bIsOpen = false; // Connection status flag // Function prototypes void get_Error(SQLSMALLINT handleType, SQLHANDLE handle); bool DFT_ODBC_Initialize(); void Cleanup(); int _tmain(int argc, _TCHAR* argv[]) {   // Static initialization flag   static int iIsInitialized = 0;   // Connection string construction   char connstr[500] = "DSN=";   const char* p_cpDSNName = "mysql_dsn";   const char* p_cpUserName = "root";   const char* p_cpPassword = "dedupe";      SQLHANDLE m_SqlStmt;   SQLHANDLE m_SqlConn;   //  static int iIsInitialized = 0;   char        m_cUserName[MAX_NAME_SIZE]; // create member char array varaible   char        m_cPassword[MAX_NAME_SIZE]; // create member char array varaible   char        m_cDSNName[MAX_NAME_SIZE];// create member char array varaible   strcat(connstr, p_cpDSNName);   /*strcat(connstr,";Database=");   strcat(connstr,p_cpDBName);*/   strcat(connstr, ";UID=");   strcat(connstr, p_cpUserName);   strcat(connstr, ";PWD=");   strcat(connstr, p_cpPassword);   strcat(connstr, ";MARS_Connection=Yes");   if (iIsInitialized == 0) // This is to ensure that , it will be called once in the lifetime of the program.   {     if (!DFT_ODBC_Initialize())     {       MessageBox(NULL, "FAILED", "Initialization of ODBC failed.", MB_OK);       return OFAILURE;     }     else       iIsInitialized = 1;   }   //m_bIsOpen = false; // set m_bIsOpen to false   try   {     memset(m_cUserName, 0, MAX_NAME_SIZE); // set memory of size m_cUserName     memset(m_cPassword, 0, MAX_NAME_SIZE);// set memory of size m_cPassword     memset(m_cDSNName, 0, MAX_NAME_SIZE);// set memory of size m_cServiceName     strcpy(m_cUserName, p_cpUserName);//string copy p_cpUserName to m_cUserName     strcpy(m_cPassword, p_cpPassword);//string copy p_cpPassword to m_cPassword     strcpy(m_cDSNName, p_cpDSNName);//string copy p_cpServiceName to m_cServiceName     if (!SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_DBC, m_SqlEnv, &m_SqlConn)))     {       get_Error(SQL_HANDLE_ENV, m_SqlEnv);     }     SQLCHAR retconn[1024];     //if(!SQL_SUCCEEDED(SQLConnect (m_SqlConn ,(SQLCHAR *) m_cDSNName, SQL_NTS, (SQLCHAR *)m_cUserName, SQL_NTS,(SQLCHAR *) m_cPassword, SQL_NTS)))     if (!SQL_SUCCEEDED(SQLDriverConnect(m_SqlConn, NULL, (SQLCHAR*)connstr, SQL_NTS, retconn, 1024, NULL, SQL_DRIVER_NOPROMPT)))     {       get_Error(SQL_HANDLE_DBC, m_SqlConn);     }     //MessageBox(NULL,(char*)retconn,"connstr",MB_OK);     if (!SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_STMT, m_SqlConn, &m_SqlStmt)))     {       get_Error(SQL_HANDLE_STMT, m_SqlStmt);     }     if (!SQL_SUCCEEDED(SQLSetStmtAttr(m_SqlStmt, SQL_ATTR_QUERY_TIMEOUT, (SQLPOINTER)3600, SQL_IS_INTEGER)))     {       get_Error(SQL_HANDLE_STMT, m_SqlStmt);     }     if (!SQL_SUCCEEDED(SQLSetConnectAttr(m_SqlConn, SQL_ATTR_CONNECTION_TIMEOUT, (SQLPOINTER)3600, 0)))     {       get_Error(SQL_HANDLE_DBC, m_SqlConn);     }     if (!SQL_SUCCEEDED(SQLSetConnectAttr(m_SqlConn, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_ON, 0)))     {       get_Error(SQL_HANDLE_DBC, m_SqlConn);     }     else     {       // Prepare SQL statement with parameter placeholder       const char* query = "SELECT * FROM base WHERE uuid = ?";       if (!SQL_SUCCEEDED(SQLPrepare(m_SqlStmt, (SQLCHAR*)query, SQL_NTS))) {         get_Error(SQL_HANDLE_STMT, m_SqlStmt);         return OFAILURE;       }       // Create a buffer to hold the UUID value for binding       SQLCHAR uuidParam[37]; // 36 characters for UUID + null terminator       // Bind the parameter once       if (!SQL_SUCCEEDED(SQLBindParameter(m_SqlStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 37, 0, &uuidParam, 0, NULL))) {         get_Error(SQL_HANDLE_STMT, m_SqlStmt);         return OFAILURE;       }       // Generate and use 1000 UUIDs (For demonstration, using uuid-1, uuid-2, ..., uuid-1000)       for (int i = 1; i <= 10000; ++i) {         // Create a simple UUID string: "uuid-1", "uuid-2", ..., "uuid-1000"         snprintf((char*)uuidParam, sizeof(uuidParam), "%d", i);         // Execute the prepared statement         if (!SQL_SUCCEEDED(SQLExecute(m_SqlStmt))) {           get_Error(SQL_HANDLE_STMT, m_SqlStmt);           continue; // Skip to the next UUID if execution fails         }         // Fetch and display the results for the current UUID         SQLINTEGER id;         SQLCHAR column_name[100];         SQLCHAR column_value[100];         // Iterate over the rows for the current UUID         while (SQL_SUCCEEDED(SQLFetch(m_SqlStmt))) {           // Example of fetching columns (change based on your table schema)           SQLGetData(m_SqlStmt, 1, SQL_C_SLONG, &id, 0, NULL); // Assuming 1st column is an integer (ID)           SQLGetData(m_SqlStmt, 2, SQL_C_CHAR, column_name, sizeof(column_name), NULL); // 2nd column: name           SQLGetData(m_SqlStmt, 3, SQL_C_CHAR, column_value, sizeof(column_value), NULL); // 3rd column: value           // Print the result for this row           std::cout << "UUID: uuid-" << i << ", ID: " << id << ", Name: " << column_name << ", Value: " << column_value << std::endl;         }         // Reset the statement for the next UUID (optional)         SQLFreeStmt(m_SqlStmt, SQL_CLOSE); // Close the result set to reuse the statement handle for the next UUID       }       // Cleanup       SQLFreeHandle(SQL_HANDLE_STMT, m_SqlStmt);       SQLFreeHandle(SQL_HANDLE_DBC, m_SqlConn);       return OSUCCESS;     }   }   catch (...)   {     return OFAILURE;   }   return true;//m_bIsOpen; // return the m_bIsOpen value } // Error handling function to retrieve and display ODBC error details void get_Error(SQLSMALLINT handleType, SQLHANDLE handle) {   SQLCHAR SQLState[6], message[256];   SQLINTEGER nativeError;   SQLSMALLINT msgLen;   // Retrieve error message   SQLGetDiagRec(handleType, handle, 1, SQLState, &nativeError, message, sizeof(message), &msgLen);   // Display error message   std::cerr << "ODBC Error: " << message << " (SQLState: " << SQLState << ", NativeError: " << nativeError << ")" << std::endl; } // Initialize the ODBC environment bool DFT_ODBC_Initialize() {   if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &m_SqlEnv) != SQL_SUCCESS) {     std::cerr << "Unable to allocate ODBC environment handle." << std::endl;     return false;   }   // Set the ODBC version to 3.x   if (SQLSetEnvAttr(m_SqlEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0) != SQL_SUCCESS) {     std::cerr << "Unable to set ODBC version." << std::endl;     SQLFreeHandle(SQL_HANDLE_ENV, m_SqlEnv);     return false;   }   return true; }



In this above code at line Reset the statment for next uuid option .. it's not able free the memory.. at every iteration memory is increasing, can help with this , for this memory issue

Viewing all articles
Browse latest Browse all 527

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>