2009-08-25 2 views
0

J'ai une application C++ se connectant à MS SQL Server 2005 en utilisant CDynamicAccessor. Lorsque ma colonne est text ou ntext, le CDynamicAccessor :: GetColumnType retourne toujours DBTYPE_IUNKNOWN. Je peux lier les données comme ISequentialStream et lire le flux d'octets. Cependant, comment puis-je savoir si la colonne que je suis en train de lire est text ou ntext, et donc interpréter le flux d'octets comme ASCII ou Unicode?Comment dire à une colonne est le texte ou ntext lors de la connexion à la base de données en utilisant CDynamicAccessor?

Répondre

0

La classe CDynamicAccessor remplace la valeur DBTYPE d'origine de la colonne par DBTYPE_UNKNOWN. Pour obtenir le DBTYPE d'origine, nous devons appeler la fonction GetColumnInfo. Un exemple de la façon de le faire est l'exemple d'application de DynamicConsumer inclus dans les échantillons Visual Studio 2008:

// the following case will handle BLOBs binded as ISequentialStream/IStream pointer 
if(dbtype == DBTYPE_IUNKNOWN) 
{ 
    // first we have to determine what was the column's type originally reported by the provider 
    CComHeapPtr<DBCOLUMNINFO> spColumnInfo; 
    CComHeapPtr<OLECHAR> spStringsBuffer; 
    DBORDINAL nColumns = 0; 
    HRESULT hres = rs.CDynamicAccessor::GetColumnInfo(rs.m_spRowset, &nColumns, &spColumnInfo, &spStringsBuffer); 
    ATLASSERT(SUCCEEDED(hres)); 
    ATLASSERT(col <= nColumns); 
    DBTYPE wType = spColumnInfo[col-1].wType; 
    ... 
} 

La solution alternative consiste à définir le CDynamicAccessor à DBBLOBHANDLING_NOSTREAMS, qui semble rendre le code beaucoup moins compliqué à gérer les données chargement (vous pouvez le voir dans l'exemple de code VS2008 complet). Cependant, je ne suis pas sûr pourquoi l'utilisation de stream est l'option par défaut, et s'il y a des inconvénients à ne pas utiliser de flux.

Questions connexes