[MFC] Impossible de mettre à jour dans un CRecordset.
Bonjour,
j'ai encore un petit problème avec un objet de type CRecordset, son champs m_bUpdatable reste à FALSE même après un open sur un objet CDatabase qui a bien ce champ-là à TRUE.
voici le code en question :
Code:
1 2 3 4 5 6 7 8
|
CDatabase blarf;
blarf.Open(_T("base_test_mssql"),FALSE,FALSE,"ODBC;" , FALSE);
CRecordset r(&blarf);
r.Open(AFX_DB_USE_DEFAULT_TYPE, "SELECT max(typpreparation) FROM dbo.type_preparation"); |
Après l'Open, je vois que le champ m_bUpdatable est à zéro, en fouillant un peu, je trouve une erreur se produisant dans la fonction PrepareAndExecute quand on fait appel à une fonction ODBC nommée SQLPrepare qui me sort une erreur S1C00 comme quoi mon driver est "not capable".
J'utilise SQL Server 2000. Sont-ce mes drivers ODBC qui ne sont pas à jour, ou y a-t-il autre chose à faire ?
Si quelqu'un est inspiré ...
Re: pb de longueur peut etre
Citation:
Envoyé par R@IZER
g le meme probleme que toi et ma requette est couper.
le probleme c est que la variable qui recoit la requette ne stock que 255 caracteres.
donc si tu trouve une solution je suis grave interresser pour que tu m explique comment gerer ce probleme!!
merci et bonne chance
En ce qui concerne la requête qui est coupée, ça ne semble pas être un problème. Certes on la voit tronquée, mais elle s'exécute bien et donne les résultats escomptés (dans mon exemple ma requête fait plus de 1000 caractères).
Sinon pour l'autre problème avec la fonction Update(), je n'ai pas réussi à trouver le problème, car à un moment on est coincés dans le code, explication
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
RETCODE nRetCode;
AFX_ODBC_CALL(::SQLSetPos(m_hstmt, 1, wPosOption, SQL_LOCK_NO_CHANGE));
if (!Check(nRetCode))
{
TRACE0("Error: failure updating record.\n");
AfxThrowDBException(nRetCode, m_pDatabase, m_hstmt);
}
// Only have data-at-execution columns for CLongBinary columns
if (nRetCode == SQL_NEED_DATA)
SendLongBinaryData(m_hstmt);
// This should only fail if SQLSetPos returned SQL_SUCCESS_WITH_INFO explaining why
if (nRetCode == SQL_SUCCESS_WITH_INFO && GetRowStatus(1) != wExpectedRowStatus)
ThrowDBException(AFX_SQL_ERROR_UPDATE_DELETE_FAILED); |
SQLSetPos est LA fonction odbc qui va vraiment mettre à jour sur la base de données. Celle-ci marche bien, elle donne un code retour de 1, donc tout va bien.
Mais c'est le tout dernier traitement qui foire en fait, celui avec la fonction GetRowStatus. Si on regarde le corps de cette fonction, on trouve ça :
Code:
1 2 3
|
_AFXDBCORE_INLINE WORD CRecordset::GetRowStatus(WORD wRow) const
{ ASSERT(IsOpen()); ASSERT(wRow > 0); return m_rgRowStatus[wRow-1]; } |
Donc on voudrait bien savoir ce que contient substantiellement la variable m_rgRowStatus, et bien on ne le saura pas, rien dans l'aide de visual, on ne trouve rien dans msdn non plus ...
Du coup la solution est d'utiliser la fonction ODBC à part et toute seule, et ça marche (pour l'instant)