EErrorType CDatabaseStatementOdbc::DoInitialise() { DatabaseConnectionOdbcSPtr connection = DoGetConnectionOdbc(); if ( !connection ) { DB_EXCEPT( EDatabaseExceptionCodes_StatementError, ERROR_ODBC_LOST_CONNECTION ); } EErrorType errorType; HDBC hParentStmt = connection->GetHdbc(); CLogger::LogDebug( ( Format( DEBUG_ODBC_PREPARING_STATEMENT ) % this ).str() ); errorType = SqlSuccess( SQLAllocHandle( SQL_HANDLE_STMT, hParentStmt, &_statementHandle ), SQL_HANDLE_STMT, hParentStmt, INFO_ODBC_AllocHandle ); #if defined( _WIN32 ) if ( errorType == EErrorType_NONE ) { OdbcCheck( SQLSetStmtAttr( _statementHandle, SQL_SOPT_SS_DEFER_PREPARE, SQL_DP_OFF, SQL_IS_UINTEGER ), SQL_HANDLE_STMT, _statementHandle, INFO_ODBC_SetStmtAttr ); } #endif if ( errorType == EErrorType_NONE ) { OdbcCheck( SQLPrepareA( _statementHandle, ( SqlChar * )_query.c_str(), SQLINTEGER( _query.size() ) ), SQL_HANDLE_STMT, _statementHandle, INFO_ODBC_Prepare ); } if ( errorType == EErrorType_NONE ) { SQLSMALLINT count = 0; OdbcCheck( SQLNumParams( _statementHandle, &count ), SQL_HANDLE_STMT, _statementHandle, INFO_ODBC_NumParams ); CLogger::LogDebug( DEBUG_ODBC_EXPECTED_PARAMETERS + StringUtils::ToString( count ) ); } for ( auto && parameter : DoGetParameters() ) { std::static_pointer_cast< CDatabaseStatementParameterOdbc >( parameter )->Initialise( _statementHandle ); } return errorType; }
//--------------------------------------------------------------------------- DSQLParam & DSQLParam::setMutant(const ksys::Mutant & value) { struct tm t; TIMESTAMP_STRUCT * ts; switch( value.type() ){ case ksys::mtNull : break; case ksys::mtInt : int_ = value; break; case ksys::mtFloat : float_ = value; break; case ksys::mtTime : t = value; ts = (TIMESTAMP_STRUCT *) time_; ts->year = t.tm_year + 1900; ts->month = t.tm_mon + 1; ts->day = t.tm_mday; ts->hour = t.tm_hour; ts->minute = t.tm_min; ts->second = t.tm_sec; ts->fraction = SQLINTEGER((uint64_t(value) % 1000000u) * 1000u); break; case ksys::mtCStr : case ksys::mtWStr : case ksys::mtStr : case ksys::mtString : string_ = utf8::String(value).getUNICODEString().ptr(NULL); break; case ksys::mtBinary : stream_ = value; break; } type_ = value.type(); return *this; }