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;
}