CRecordset::Update() Exception
-
Hi Leuts!
ich weiß dieses Problem wurde schon öffter mal im Forum angesprochen aber leider noch nie beantwortet! Hiermit versuche ich es nochmal!
Also. Beim Ausführen von Update() (vorher natürlich Edit() ausgeführt) wird ein Exceprion geworfen AFX_SQL_ERROR_NO_ROWS_AFFECTED! Hab das schon im MSDN usw. nachgelesen
AFX_SQL_ERROR_NO_ROWS_AFFECTED You called CRecordset::Update or Delete, but when the operation began the record could no longer be found.
So heißt für mich der Record ist nicht mehr da! Um sicher zu gehen mache ich bor dem Update m_pSet->GetRowsFetched() und auch m_pSet->GetRecordCount() beide male krieg ich 1 zurück! Das heißt für mich er hat ein record und Row!
Wenn ich m_pSet überprüfe hat er die neuen Daten drin stehen!
Kann es an der Datenbank connection liegen?? Das die verbindung von CDatabase irgendwie getrennt ist?? konnte das bischer nicht ganz auschließen!Hier etwas Code
CRecordset* CStam_Mit_View::OnGetRecordset() { if (m_pSet != NULL) return m_pSet; m_pSet = new CStam_Mit_Set(NULL); m_pSet->Open(); return m_pSet; } CStam_Mit_Set* CStam_Mit_View::GetRecordset() { CStam_Mit_Set* pData = (CStam_Mit_Set*) OnGetRecordset(); ASSERT(pData == NULL || pData->IsKindOf(RUNTIME_CLASS(CStam_Mit_Set))); return pData; } void CStam_Mit_View::OnInitialUpdate() { BeginWaitCursor(); GetRecordset(); CRecordView::OnInitialUpdate(); if (m_pSet->IsOpen()) { CString strTitle = m_pSet->m_pDatabase->GetDatabaseName(); CString strTable = m_pSet->GetTableName(); if (!strTable.IsEmpty()) strTitle += _T(":") + strTable; GetDocument()->SetTitle(strTitle); } EndWaitCursor(); m_pSet->GetRecordCount(); } void CStam_Mit_View::EditRow(CString szId) { //CDatabase db; OnInitialUpdate(); bool bCheck; CString szQuery; szQuery.Format("Select * from Vereinsmitglieder where Mitglieds_Id = '%s';",szId); m_pSet->Close(); bCheck = ((CVerein_ProjektDoc*)(this->GetDocument()))->GetQueryResult(szQuery,m_pSet); if(bCheck == TRUE) { UpdateData(FALSE); } } void CStam_Mit_View::OnButtonOk() { // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen CString string; string.Format("%i",m_pSet->GetRowsFetched()); AfxMessageBox(string); m_pSet->Edit(); UpdateData(); m_pSet->Update(); } ///////////////////////////////////////////////////////////////////////// bool CVerein_ProjektDoc::GetQueryResult(CString szQuery, CStam_Mit_Set* DBSet) { if(!DBSet->IsOpen()) { DBSet->Open(CRecordset::snapshot, szQuery); if(DBSet->IsOpen()) { if(!DBSet->IsEOF()) return TRUE; } else return FALSE; } if (DBSet->IsBOF()) { return FALSE; } else if ( !DBSet->IsEOF() ) { DBSet->MoveNext(); if(!DBSet->IsEOF()) return TRUE; else return FALSE; } else { return FALSE; } return FALSE; }Ich hoffe ihr könnt mir helfen! Sitze schon seit 2 Tagen dran! Sorry für den hässligen Code, aberich hab das schon soviel ausprobiert,....
Danke
Gruß Andi
-
So da wohl keiner dieses Problem vor mir hatte versuche ich es mit en paar Details die ich bischer rausgefunden habe!
Also ich glaube ich habe eine mögliche fehlerquelle gefunden!
void CRecordset::ExecuteUpdateSQL() { RETCODE nRetCode; if(!(m_dwOptions & optimizeBulkAdd)) { USES_CONVERSION; AFX_ODBC_CALL(::SQLExecDirect(m_hstmtUpdate, (UCHAR*)T2A((LPTSTR)(LPCTSTR)m_strUpdateSQL), SQL_NTS)); if (!Check(nRetCode)) ThrowDBException(nRetCode, m_hstmtUpdate); } else { AFX_ODBC_CALL(::SQLExecute(m_hstmtUpdate)); if (!Check(nRetCode)) ThrowDBException(nRetCode, m_hstmtUpdate); }Hier
AFX_ODBC_CALL(::SQLExecDirect(m_hstmtUpdate, (UCHAR*)T2A((LPTSTR)(LPCTSTR)m_strUpdateSQL),SQL_NTS));wird das axception geworfen!
Und zwar wird in dem Makro davor ein SQL Statement generiert!
"{"UPDATE `vereinsmitglieder` SET `Name`=?,`Vorname`=?,`ort`=?,`str_nr`=?,`geschlecht`=?,`aktiv_passiv`=?,`kontoinhaber`=?,`bankinstitut`=? WHERE CURRENT OF SQL_CUR0"}"
Nach der verarbeitung dieses Strings wird das exception geworfen!
komisch ist das ich im Dialog viel mehr Felder habe!
Kann es sein das der String zu lang ist und somit einen Fehler verursacht???Währe sehr sehr dankbar für anregungen!
Gruß Andi
-
Deine SQL-Anweisung sieht irgendwie komisch aus. Seit wann muss der Tabellenname mit Apostrophen angegeben werden (genau genommen sind das noch nicht mal welche...) ? Und die anderen Apostroph gehören doch wohl eher um den Inhalt und nicht um die Feldnamen. Vielleicht liegt es daran ?
-
ich genaudasselbe problem, bei mir kommt die meldung no rows affected und ich find den fehler nicht, meinst das liegt an den ODBC treibern?
MfG
T1c4L