SQL befehl übergeben



  • Hallo ich bins nochmal,

    leider funktioniert es auch mit [] nicht.
    Wenn ich statt Kontaktperson einen * einfüge (für alles) dann bekomme ich keine Fehlermeldung. Sobald ich einen Namen von einer Spalte eingebe bekomme ich die Fehlermeldung zur Laufzeit des Programms "Fehler beim abrufen eines Datensatzes!" Der Fehler kommt von der Open()-Funktion.
    Hier nochmal mein Code.

    void CMaterialAnlegenView::OnBnClickedSucheLieferant()
    {
    	CTabLieferanten mTabLief;
    
    	mTabLief.Open( CRecordset::snapshot,"SELECT Kontaktperson FROM
             Lieferanten",CRecordset::readOnly );
    
             mTabLief.MoveFirst();
    	CString strTest=(CString)mTabLief.m_Kontaktperson;
    
    	mTabLief.Close();
    }
    

    Muss ich vielleicht etwas in der von CRecordSet abgeleiteten Klasse verändern?
    Ich bin langsam am verzweifeln, weil laut der MSDN und paar anderen Nachforschungen sollte es so eigentlich mit dem SQL-Statement funktionieren.

    Gruß
    bbatec



  • Hallo ich bins nochmal 😃
    Lässt sich das ohne Fehler öffnen ?

    mTabLief.Open(CRecordset::snapshot, "SELECT Kontaktperson AS KONTAKT FROM Lieferanten", CRecordset::readOnly);
    

    Oder vielleicht das:

    mTabLief.Open(CRecordset::forwardOnly, "SELECT Kontaktperson AS KONTAKT FROM Lieferanten", CRecordset::readOnly);
    


  • Hallo isabeau,

    werde ich heute nachmittag mal probieren, bin gerade auf der Arbeit.

    Eine Frage was ist

    ".... KONTAKT ...."
    

    ?
    Gruß
    bbatec



  • Ich vermute einfach mal, dass das nicht klappt, weil ein ganz bestimmtes Feld angefordert wird. Irgendwo hiess es mal, dass das Ergebnis von so einem SELECT in die erste Spalte der Tabelle geschrieben wird. Vielleicht passen die Datentypen nicht zusammen ?
    Naja, egal. Ich hatte jetzt diese Idee:
    mit dem "AS KONTAKT" in dem Select-Statement wird praktisch ein neues Feld "KONTAKT" erstellt (kann auch anders benannt werden), in dem das Ergebnis von dem Select eingetragen wird. Also anstatt zu sagen "gib mir alles aus dem Feld Kontaktperson" und das dann auszulesen sagst du jetzt "gib mir alles aus dem Feld Kontaktperson in dem neuen Feld KONTAKT" und dann liest du das aus.
    Und an die Daten kommt man dann so (wenn es funktioniert):

    CRecordset	rs;  // bzw. dein CRecordTest rt;
    CString		strAbfrage;
    CString		strErgebnis;
    
    strAbfrage.Format("SELECT Kontaktperson AS KONTAKT FROM Lieferanten");
    
    rs.Open(CRecordset::forwardOnly, strAbfrage, CRecordset::readOnly);
    
    while(!rs.IsEOF())
    {
    	rs.GetFieldValue("KONTAKT", strErgebnis);
    	AfxMessageBox(strErgebnis);	// nur zur Kontrolle
    	rs.MoveNext();
    }
    
    rs.Close();
    


  • Hallo isabeau,

    funktioniert leider nicht, bekomme jetzt folgende Fehlermeldung
    "Ungültiger Zeichenwert für Konvertierungsangabe. bei Spalte 1 (KONTAKT)"



  • Hallo ich bins nochmal

    wenn ich nach der 1. Spalte Slectiere also

    mTabLief.Open( CRecordset::snapshot,"SELECT LieferantenNr FROM Lieferanten",CRecordset::readOnly );
    

    LieferantenNr steht in der 1. Spalte dann funktioniert es, muss ich dem SQL-Befehl mitgeben in welcher Spalte er selektieren muss?

    Gruß

    BBATEC



  • Hallo hat einer eine Idee?



  • könnte vielleicht helfen:
    bei klappts immer und ich definiere mit nen makro, und das sieht so aus:

    #define SQL_UPDATELIST(DB, TAB)						(CString) "SELECT * FROM " + DB + "." + TAB + ";"
    

    ich habe vorsichtshalber immer den datenbanknamen angegeben und ein semikolon am ende der anweisung. das semikolon kann man weglassen, habe ich mal gehört.

    versuchs mal



  • Hallo Red Skall,

    kannst du mir mal bitte ein bischen dein Code erklären,
    irgendwie weiß ich es nicht wie ich das bei meinem Problem anwenden kann/soll.

    Danke dir!
    🙂



  • wenn du diese zeile in dein prggramm schreibst (ausserhalb einer funktion am besten) dann kannst du dieses makro "benutzen".

    das machst du so:

    mTabLief.Open( CRecordset::snapshot,"SQL_UPDATELIST("Datenbankname", "Tabellenname"), CRecordset::readOnly );
    

    die funktion der #define - anweisung erklärt sich von selbst:
    er setzt die in den klammern stehenden begriffe in die anweisung (rechts) ein.

    das erspart dir schreibarbeit wenn du den befehl mehrfach verwndest und macht es übersichtlich


Anmelden zum Antworten