1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| //struct DATA_BINDING
//{
// SQLSMALLINT TargetType;
// SQLPOINTER TargetValuePtr;
// SQLINTEGER BufferLength;
// SQLLEN StrLen_or_Ind;
//};
HSTMT hStmt; //=> Statement contenant le résultat de la requête
// On initialise ce statement
SqlSuccess( SQLAllocHandle( SQL_HANDLE_STMT, m_hDbc, & hStmt ), SQL_HANDLE_DBC, m_hDbc );
// On exécute la requête
if( SqlSuccess( SQLExecDirect( m_hStmt, (SqlChar*)strQuery.c_str(), SQLINTEGER( strQuery.size() ) ), SQL_HANDLE_STMT, hStmt, strQuery ) )
{
// Ca a marchééé !!
int iBufferSize = 1024;
SQLSMALLINT iNbColumns;
char szBuffer[255];
SQLSMALLINT iResult;
SQLLEN iNumericAttribute;
std::string strName;
DATA_BINDING * pColumnData;
std::vector< sdt::pair< std::string, int > > arrayColumns;
// On récupère le nombre de colonnes
if( SqlSuccess( SQLNumResultCols( hStmt, & iNbColumns ), SQL_HANDLE_STMT, m_hStmt, strQuery ) && iNbColumns > 0 )
{
for( SQLSMALLINT i = 1 ; i <= iNbColumns ; i++ )
{
// Pour chaque colonne, on récupère son nom
if( SqlSuccess( SQLColAttribute( hStmt, i, SQL_DESC_LABEL, SQLPOINTER( szBuffer ), 255, & iResult, & iNumericAttribute ), SQL_HANDLE_STMT, hStmt, strQuery ) )
{
strName = szBuffer;
iResult = 0;
memset( szBuffer, 0, sizeof( szBuffer ) );
// Et son type
if( SqlSuccess( SQLColAttribute( m_hStmt, i, SQL_DESC_TYPE, SQLPOINTER( szBuffer ), 255, & iResult, & iNumericAttribute ), SQL_HANDLE_STMT, m_hStmt, strQuery ) )
{
// Le type est stocké dans iNumericAttribute
arrayColumns.push_back( std::make_pair( strName, iNumericAttribute ) );
}
}
}
// On initialise la sructure qui recevra chaque ligne du résultat
pColumnData = new DATA_BINDING[iNbColumns];
// On alloue la mémoire de ses champs
for( int i = 0 ; i < iNbColumns ; i++ )
{
pColumnData[i].TargetType = SQL_C_CHAR;
pColumnData[i].BufferLength = iBufferSize + 1;
pColumnData[i].TargetValuePtr = new unsigned char[pColumnData[i].BufferLength];
}
BOOL bResult = TRUE;
// On associe chaque colonne du statement aux colonnes e notre structure
for( int i = 0 ; i < iNbColumns && bResult ; i++ )
{
bResult = SqlSuccess( SQLBindCol( hStmt, ( SQLUSMALLINT )i + 1, pColumnData[i].TargetType, pColumnData[i].TargetValuePtr, pColumnData[i].BufferLength, &( pColumnData[i].StrLen_or_Ind ) ), SQL_HANDLE_STMT, hStmt, strQuery );
}
std::string strFieldValue;
// On parcourt maintenant les lignes du résultat
while( SqlSuccess( SQLFetch( hStmt ), SQL_HANDLE_STMT, hStmt ) )
{
strFieldValue = (char*)pColumnData[i].TargetValuePtr;
// Tu peux maintenant faire ce que tu veux de la valeur, en fonction du type de la colonne.
}
// free memory from the binding
for( int i = 0 ; i < iNbColumns ; i++ )
{
delete [] pColumnData[i].TargetValuePtr;
}
delete [] pColumnData;
SqlSuccess( SQLCloseCursor( hStmt ), SQL_HANDLE_STMT, hStmt );
}
}
if( hStmt != SQL_NULL_HSTMT )
{
SQLFreeHandle( SQL_HANDLE_STMT, hStmt );
} |
Partager