CString SQL-Statement in Open()



  • Hi Leute,
    ich will per CRecordset::Open() gleich ein SQL-Statement übergeben, jedoch habe ich dieses in einem CString. Wenn ich diesen String nun übergebe (an 2. Stelle) kommt eine Fehlermeldung.
    In der MSDN steht ja, dass es eigendlich vom Typ LPCTSTR sein müsste. Unteranderem auch die Art ein String per CALL aufzurufen.

    So habe ich es mit

    "{call sSearchSQL}"
    

    versucht, doch das funktionert auch nicht, da eine Eingangstabelle oder sowas verlangt wird.

    Auf gut Deutsch: ich hab kein Plan!

    Kann mir da jemand einen Tipp geben um den CString doch übergeben zu können oder irgendeinen anderen?



  • CString::GetBuffer(0);



  • Der gleiche Fehler kommt jetzt immernoch 😮 😕 😞
    Hier der Code:

    bool CWortAnalyse::DurchsucheDb(CString sWortstamm, int iTempus)
    {
    	CString sSearch;
    	CString sSearchSQL;
    	CString sSearchWhere;
    	CString sEndung;
    	// Switchen und Endung zuweisen
    
    	switch(iTempus)
    	{
                 [....]
    	}
    	// SQL zusammensetzen
    	sSearch = "SELECT * FROM [Vokabeln] WHERE ";
    	sSearchSQL = sSearch + sSearchWhere + sWortstamm + sEndung;
    	AfxMessageBox(sSearchSQL);
    	LPCTSTR pSearchSQL = sSearchSQL.GetBuffer();
    
    	// Klasse intialisieren
    	CVokabelnDb vokDb;
    	if(vokDb.Open(CRecordset::snapshot,pSearchSQL,CRecordset::none))
    	{
    		AfxMessageBox("Funzt!");
    	}
    
    	return true;
    }
    


  • tach auch ,
    versuch es doch mal mit nem cast

    LPCTSTR pSearchSQL = **(LPCTSTR)**sSearchSQL.GetBuffer();



  • Dein Problem sind (vermutlich) die fehlenden '
    Du solltest CString::Format benutzen.

    Also ungefähr so:

    CString sqltx;
    
    sqltx.Format("Select * From Vokabeln Where  %s = '%s'", sSearchWhere,sWortstamm);
    

    Was deine Endung bedeutet weiß ich nicht. GetBuffer ist nicht notwendig



  • es ändert sich nichts! gibt es überhaupt eine Lösung?



  • wenn du einen CString auf LPCTSTR(CString) castest, sollte das auf jeden Fall funktionieren.
    Ich vermute dein Problem liegt in einem SQL -Statement, welches die DB nicht versteht und du einen COM-Error erhälts, den du aber nicht abfängst. Setzte die Abfrage in einen try - catch Block und hole dir mal den _com_error ab.

    Gruß



  • Hi,

    ich habe bereits öfters CRecordSet.Open mit CStrings verwendet, das funktioniert ohne Probleme - Du brauchst KEIN casting auf LPCSTR oder sowas in der Richtung.
    Interessant wäre es zu wissen, welche Fehlermeldung Du bekommst und wie der Inhalt deines SQL-Strings zur Laufzeit aussieht.

    Gruss

    yeti



  • Der Fehler kommt, (obwohl ich ihn nochnichteinmal abfrage) in einer MessageBox.
    Er lautet:

    1 Parameter wurden erwartet, aber es wurde zu wenig Parameter übergeben.

    Den Inhalt des SQL Strings habe ich mir aus testzwecken immer anzeigen lassen in einer MessageBox. Ich teste das Programm mit der Eingabe "amare" (Latein). Also sieht in diesem Fall der String so aus:

    SELECT * FROM [Vokabeln] WHERE Praesens = 'amare'
    


  • 1 Parameter wurden erwartet, aber es wurde zu wenig Parameter übergeben.

    Das deutet darauf hin, dass deine Member der Recordset-Klasse nicht 100%ig mit den tatsächlich vorhandenen Datenbankfeldern übereinstimmt. Kannst du ja vielleicht mal überprüfen (nach Anzahl und Typ).



  • Hi,

    das Problem hatte ich auch schonmal - leider kann ich mich an die Lösung nur noch undeutlich erinnern 🙄

    Ich denke aber, es hing irgendwie mit den String-delimitern (') zusammen. Mach doch mal eins: An der Stelle, an der Du den SQL-String komplett hast, fügst Du ein TRACE in dieser Form ein:

    TRACE("SQL-String: %s\n", sSearchSQL);
    

    und lass dann dein Programm im Debug-Modus über diese Stelle rauschen, dann siehst Du im Debug-Window, was der String wirklich enthält.

    Irgendwie traue ich der MessageBox nicht so hundertprozentig...

    Lass mich wissen, was dabei rausgekommen ist.

    Gruss

    yeti



  • Hi Leute!
    Ich hab das Problem gelöst. Ich hatte mich in meiner Access Tabelle verschrieben. Ich hatte eine Spalte "Infinitv" genannt anstatt von "Infinitiv" (hinten mit iv). Jetzt hab ich überall das gändert und daran kanns nichtmehr liegen.
    Es lag an der WHERE Klausel! Jetzt hab ich in die GetDefaultSQL() meinen Standart Abfragestring gepackt, und einen Filter für die WHERE Klausel eingerichtet (m_strFilter).

    Jetzt funktioniert es! Danke an euch alle! 🙂 👍


Anmelden zum Antworten