SQL-Abfrage funktioniert nicht! Bitte um Hilfe



  • Hallo,

    ich habe folgendes Problem: Ich habe eine Access-Datenbank mit 2 Tabellen. Dies ist verbunden mit meinen zwei Recordsets. Die Applikation ist gesplittet mit einem Splitterwnd. Die linke und rechte Seite ist jeweils für eine Tabelle zuständig.

    So, wenn ich auf der linken Seite eine SQL-Abfrage ausführe, funktioniert das bestens. Wenn ich auf der rechten Seite eine ausführe hängt mir die MFC an meinen Abfragestring einfach noch was hinten an. Somit schlägt die Abfrage dann fehl.

    Linke Seite die funktioniert:

    void CMedienDBView::SQLAbfrage()
    {
      m_pSet->Close();
      UpdateData(TRUE);
      CString sqlabfrage="";
    
      if(IsDlgButtonChecked(IDC_RADIOTITEL))
      {					
        sqlabfrage="SELECT * FROM [Objekt]WHERE "[Titel] Like '%"+m_Titel+"%'";
        m_pSet->Open(CMedienDBSet::snapshot,sqlabfrage,CMedienDBSet::none);
      }
      if(IsDlgButtonChecked(IDC_RADIOSYSTEM))
      {						
        sqlabfrage="SELECT * FROM [Objekt] WHERE [System] LIKE '%"+m_System+"%'";
        m_pSet->Open(CMedienDBSet::snapshot,sqlabfrage,CMedienDBSet::none);
      }
      if(IsDlgButtonChecked(IDC_RADIOMTYP))
      {
        sqlabfrage="SELECT * FROM [Objekt] WHERE [Medientyp] LIKE '%"+m_Mtyp+"%'";
        m_pSet->Open(CMedienDBSet::snapshot,sqlabfrage,CMedienDBSet::none);
      }
    
      if(m_pSet->GetRecordCount()==0)
      {
        m_pSet->Close();
        AfxMessageBox("Es wurde kein Eintrag gefunden!",MB_OK | MB_ICONINFORMATION);
       m_pSet->Open(CMedienDBSet::snapshot,"SELECT * FROM  Objekt]",CMedienDBSet::none);
      }
    
      m_pSet->Requery();
      ShowData();
      UpdateData(FALSE);
      m_iMerkerSuchen=0;
    }
    

    Rechte Seite funktioniert nicht:

    void CMedienDBView2::SQLAbfrage()
    { 
      m_pSet2->Close();	
      UpdateData(TRUE);
      CString sqlabfrage="";	
    
    if(IsDlgButtonChecked(IDC_RADIOVORNAME))
    {				
        sqlabfrage="SELECT * FROM [Leiher] WHERE [Vorname] LIKE '%"+m_Vorname+"%'";
        m_pSet2->Open(MedienDBSet2::snapshot,sqlabfrage,MedienDBSet2::none);	
    }
    if(IsDlgButtonChecked(IDC_RADIONACHNAME))
    {						
        sqlabfrage="SELECT * FROM [Leiher] WHERE [Nachname] LIKE '%"+m_Nachname+"%'";
        m_pSet2->Open(MedienDBSet2::snapshot,sqlabfrage,MedienDBSet2::none);	
    }
    if(IsDlgButtonChecked(IDC_RADIOTELEFON))
    {
        sqlabfrage="SELECT * FROM [Leiher] WHERE [Telefonnummer] LIKE '%"+m_Telefon+"%'";
        m_pSet2->Open(MedienDBSet2::snapshot,sqlabfrage,MedienDBSet2::none);	
    }
    if(IsDlgButtonChecked(IDC_RADIODATUM))
    {				
        sqlabfrage="SELECT * FROM [Leiher] WHERE [Datum] LIKE '%"+m_Datum+"%'";
        m_pSet2->Open(MedienDBSet2::snapshot,sqlabfrage,MedienDBSet2::none);
    }
    if(m_pSet2->GetRecordCount()==0)
    {
        m_pSet2->Close();
        AfxMessageBox("Es wurde kein Eintrag gefunden!",MB_OK | MB_ICONINFORMATION);
        m_pSet2->Open(MedienDBSet2::snapshot,"SELECT * FROM [Leiher]",MedienDBSet2::none);
    }
    
    m_pSet2->Requery();	
    ShowData();	
    UpdateData(FALSE);
    
    m_iMerkerSuchen=0;
    }
    

    Auf der rechten Seite bekomme ich eine Fehlermeldung:
    ⚠ Syntaxfehler (fehlender Operator) in Abfrageausdruck '`Vorname` LIKE '%A%' WHERE Objektnummer = 1'

    Das 'WHERE Objektnummer = 1' kann ich mir absolut nicht erklären woher er das bekommt. 😕

    🙄 Bin leider noch blutender Anfänger und kenne mich noch nicht so gut aus. Würde mich freuen wenn mir jemand helfen könnte.



  • Wenn ich das richtig gesehen habe, arbeitest Du mit CRecordSet.
    CRecordSet setzt "automatisch" eine SQL-Abfrage zusammen, aus seinen einzelnen Membervariablen.
    Dafür gibt es:

    CRecordSet::m_strFilter // Where
    CRecordSet::m_strSort // Sortierung, Group ...

    Man kann den SQL-String beim Öffnen übergeben, aber das führt irgendwie meist zu Probleme (hatte ich jedenfalls)

    Ein Ausschnitt von Dir mal abgeändert:

    if(IsDlgButtonChecked(IDC_RADIOTITEL)) 
      { 
        // Select * FROM ... - es werden immer alle mit den Spalten verbundenen Membervariablen 
        // gelesen
        // Das RecordSet ist ja mit Deiner Tabelle in der DB verbunden
        // sqlabfrage="SELECT * FROM [Objekt]WHERE "[Titel] Like '%"+m_Titel+"%'"; 
        // mit Requery wird nochmals ein SQL-String aus den o.g. Membervar zusammegesetzt
    
        // Also ohne SQL-String öffnen
        m_pSet->Open(CMedienDBSet::snapshot, NULL, CMedienDBSet::none);
        // Testen, ob erfolgreich geöffnet wurde
        if (!m_pSet->IsOpen())
        {
            // Behandle den Fehler
        }
        // den WHERE-Teil zusammensetzen (ohne WHERE!)
        m_pSet->m_strFilter.Format("Titel Like '%%%s%%'", m_Titel)
        // Die Abfrage ausführen
        m_pSet->Requery();
      }
    

Anmelden zum Antworten