Fehlersuchstrategie? Zahlenüberlauf int



  • Moin!

    Ich habe vor einiger Zeit das Speichern der Kundennummer in der Datenbank von int auf varchar umstellen müssen, weil jemandem eingefallen ist, dass da auch Buchstaben reinsollen. 🙄
    Nun habe ich in der Datenbank eine Tabelle und einen View die davon betroffen sind und etliche Klassen im Programm.

    Eigentlich habe ich alles umgestellt... EIGENTLICH. 🙄
    Leider bekomme ich bei einem Select über alles immer noch einen Zahlenüberlauf bei Konvertierung varchar nach int. Wie finde ich den?
    Ich hab mir die betroffenen Klassen schon x mal angeschaut.
    Ich habe mit FindInFiles gearbeitet und nichts gefunden.

    Ich muss den finden und zwar schnell. 😞



  • Welche Datenbankschnittstelle? ODBC mit MFC?



  • MFK schrieb:

    Welche Datenbankschnittstelle? ODBC mit MFC?

    Ja, die Recordsetklasse selbst habe ich aber schon x-mal geprüft.

    CString	m_strKndNr;
    inline CString CKundenSet::GetNummer()
    {
    	if (IsFieldNull(&m_strKndNr))
    	{
    		m_strKndNr.Format(_T("%d"), m_lID);
    		return m_strKndNr;
    	}
    	return m_strKndNr; // Wegen Altkunden
    }
    inline long CKundenSet::GetNummerAsZahl()
    {
    	return atol(m_strKndNr); // Wegen Altkunden
    }
    inline bool CKundenSet::SetKundeNummer(CString f_strKndnr)
    {
    	m_strKndNr = f_strKndnr;
    	m_fKndnrOkay = TRUE;
    	return true;
    }
    // im cpp
    RFX_Text(pFX, _T("[Knd_Nr]"), m_strKndNr);
    


  • Kannst du einen Callstack zeigen?



  • Soo, zuerstmal habe ich noch bei Bedarf die genaue Meldung:

    Die Konvertierung des varchar-Wertes '10017001001001' führte zum Überlauf einer
    int-Spalte. Der maximale Wert für eine ganze Zahl wurde überschritten.
    State:22003,Native:248,Origin:[Microsoft][ODBC SQL Server Driver][SQL Server]

    So, nun der Callstack:

    USER32! 77e48b53()
    USER32! 77e34327()
    USER32! 77e24139()
    USER32! 77e244d5()
    USER32! 77e239cb()
    USER32! 77e24260()
    USER32! 77e233fc()
    CWinApp::DoMessageBox(const char * 0x0012d63c, unsigned int 16, unsigned int 0) line 113 + 25 bytes
    AfxMessageBox(const char * 0x0012d63c, unsigned int 16, unsigned int 0) line 131 + 26 bytes
    CException::ReportError(unsigned int 16, unsigned int 61704) line 108 + 23 bytes
    CWinApp::ProcessWndProcException(CException * 0x019f18a0 {CDBException}, const tagMSG * 0x0015b7bc {msg=0x00000111 wp=0x00000001 lp=0x00012092}) line 466
    AfxCallWndProc(CWnd * 0x0012f270 {CSucheKundeDlg hWnd=???}, HWND__ * 0x0002202e, unsigned int 273, unsigned int 1, long 73874) line 223 + 30 bytes
    AfxWndProc(HWND__ * 0x0002202e, unsigned int 273, unsigned int 1, long 73874) line 368
    AfxWndProcBase(HWND__ * 0x0002202e, unsigned int 273, unsigned int 1, long 73874) line 220 + 21 bytes
    USER32! 77e2a454()
    USER32! 77e06382()
    USER32! 77e07361()
    USER32! 77e1eea0()
    USER32! 77e1f46b()
    CWnd::IsDialogMessageA(tagMSG * 0x00430320 {msg=0x00000100 wp=0x0000000d lp=0x011c0001}) line 182
    CWnd::PreTranslateInput(tagMSG * 0x00430320 {msg=0x00000100 wp=0x0000000d lp=0x011c0001}) line 3424
    CDialog::PreTranslateMessage(tagMSG * 0x00430320 {msg=0x00000100 wp=0x0000000d lp=0x011c0001}) line 92
    CBasisDlg::PreTranslateMessage(tagMSG * 0x00430320 {msg=0x00000100 wp=0x0000000d lp=0x011c0001}) line 93
    CWnd::WalkPreTranslateTree(HWND__ * 0x000607b6, tagMSG * 0x00430320 {msg=0x00000100 wp=0x0000000d lp=0x011c0001}) line 2667 + 18 bytes
    CWinThread::PreTranslateMessage(tagMSG * 0x00430320 {msg=0x00000100 wp=0x0000000d lp=0x011c0001}) line 665 + 18 bytes
    CWinThread::PumpMessage() line 841 + 30 bytes
    CWnd::RunModalLoop(unsigned long 4) line 3478 + 19 bytes
    CDialog::DoModal() line 536 + 12 bytes
    CMainFrame::OnKundeSuchen() line 1223 + 11 bytes
    _AfxDispatchCmdMsg(CCmdTarget * 0x019e9d20 {CMainFrame}, unsigned int 32800, int 0, void (void)* 0x00401118 CMainFrame::OnKundeSuchen(void), void * 0x00000000, unsigned int 12, AFX_CMDHANDLERINFO * 0x00000000) line 88
    CCmdTarget::OnCmdMsg(unsigned int 32800, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 302 + 39 bytes
    CFrameWnd::OnCmdMsg(unsigned int 32800, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 894 + 24 bytes
    CWnd::OnCommand(unsigned int 98336, long 0) line 2088
    CFrameWnd::OnCommand(unsigned int 98336, long 0) line 317
    CWnd::OnWndMsg(unsigned int 273, unsigned int 98336, long 0, long * 0x0012f954) line 1597 + 28 bytes
    CWnd::WindowProc(unsigned int 273, unsigned int 98336, long 0) line 1585 + 30 bytes
    AfxCallWndProc(CWnd * 0x019e9d20 {CMainFrame hWnd=???}, HWND__ * 0x000607b6, unsigned int 273, unsigned int 98336, long 0) line 215 + 26 bytes
    AfxWndProc(HWND__ * 0x000607b6, unsigned int 273, unsigned int 98336, long 0) line 368
    AfxWndProcBase(HWND__ * 0x000607b6, unsigned int 273, unsigned int 98336, long 0) line 220 + 21 bytes
    USER32! 77e2a454()
    USER32! 77e06b41()
    USER32! 77e06b64()
    CSubclassWnd::WindowProc(unsigned int 273, unsigned int 98336, long 0) line 94 + 89 bytes
    CCaption::WindowProc(unsigned int 273, unsigned int 98336, long 0) line 142
    CSingleLineCaption::WindowProc(unsigned int 273, unsigned int 98336, long 0) line 79
    HookWndProc(HWND__ * 0x000607b6, unsigned int 273, unsigned int 98336, long 0) line 150 + 25 bytes
    USER32! 77e2a454()
    USER32! 77e04750()
    USER32! 77e055b0()
    NTDLL! 77891baf()
    CMainFrame::PreTranslateMessage(tagMSG * 0x00430320 {msg=0x00000100 wp=0x0000000d lp=0x011c0001}) line 1311 + 12 bytes
    CFormView::PreTranslateMessage(tagMSG * 0x00430320 {msg=0x00000100 wp=0x0000000d lp=0x011c0001}) line 200 + 18 bytes
    CBasisView::PreTranslateMessage(tagMSG * 0x00430320 {msg=0x00000100 wp=0x0000000d lp=0x011c0001}) line 101
    CKundenView::PreTranslateMessage(tagMSG * 0x00430320 {msg=0x00000100 wp=0x0000000d lp=0x011c0001}) line 1457
    CWnd::WalkPreTranslateTree(HWND__ * 0x000607b6, tagMSG * 0x00430320 {msg=0x00000100 wp=0x0000000d lp=0x011c0001}) line 2667 + 18 bytes
    CWinThread::PreTranslateMessage(tagMSG * 0x00430320 {msg=0x00000100 wp=0x0000000d lp=0x011c0001}) line 665 + 18 bytes
    CWinThread::PumpMessage() line 841 + 30 bytes
    CWinThread::Run() line 480 + 11 bytes
    CWinApp::Run() line 400
    AfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00134135, int 1) line 49 + 11 bytes
    WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00134135, int 1) line 30
    WinMainCRTStartup() line 330 + 54 bytes
    KERNEL32! 77e989d5

    Leider kann ich daraus keinen Rückschluß ziehen, wo der Fehler aufgetreten ist. 😕

    Der Kundenview, den man nun ja anhand des Callstacks verdächtigen könnte ist so harmlos wie er nur sein kann:

    BOOL CKundenView::PreTranslateMessage(MSG* pMsg) 
    {
    #ifdef __LABOR
    // ... viel Kram der gerade nicht in der Exe ist weil __LABOR nicht difiniert ist
    #endif
    
    	return CBasisView::PreTranslateMessage(pMsg);
    }
    


  • Habe noch nicht unter MFC mit Datenbanken gearbeitet.

    Der SQL Fehler klingt jedoch danach, dass es irgendwo in der Datenbank passiert (und nicht im Programm selbst).
    Da würde ich zuerst schauen.

    Ist im View noch eine Konvertierung?
    Probier die Abfrage mal in einem Query Tool aus (z.B. WinSQL).



  • ihoernchen schrieb:

    Ist im View noch eine Konvertierung?

    Jein, ich habe keine gefunden. Der View kommt eigentlich nur an die Get-Set-Methoden der Recordsetklasse dran.

    Probier die Abfrage mal in einem Query Tool aus (z.B. WinSQL).

    Ich habe folgende Abfrage ausprobiert:

    select * from kunden_vw where knd_nr like '%001'
    

    und das klappt fehlerfrei.
    Ich vermute daher den Fehler irgendwo im Programm.



  • Ist vielleicht in der (dynamisch erzeugten) Where Bedingung irgendeine Konvertierung drin? Im Order by? Sonst wo?
    Sieht die Abfrage (wie sie letztendlich zur Datenbank geht) in Ordnung aus?

    Bzw. wird vielleicht eine automatische Konvertierung durchgeführt? Durch die Datenbank oder das Framework (MFC-Record-dingens)?

    Das sind bei mir zumindest die häufigsten Fehlerquellen 😉



  • Wow, also ein Patzer ist ja auf jeden Fall drin... ich wundere mich, dass das funktioniert hat. 😕
    Das ist die where:

    (Kunde_Nachname like '%') AND ([Knd_Nr] = 1)
    

    Die Nummer ist aber ein Varchar. 😮
    Und wenn ein bestimmtes Häkchen gesetzt ist wird es noch schlimmer...

    strFilter += _T("((select convert(varchar, [Knd_Nr])) like \'%" + m_strKndnr + "%\')");
    

    Wieso meckert der SQL Server bei sowas nicht wegen der Syntax?

    ... 5 Minuten später...

    JAAAAAAA *hüpf* es geht jetzt. 👍

    Jetzt noch 4 Funktionen die ich noch gefunden habe korrigieren und dann Morgen nochmal in Ruhe (vor der Tagschaltung der Telefonanlage) drübergucken. 🙂


Anmelden zum Antworten