Datenbank - Datenbankzugriff mit CRecordset



  • Hallo,

    ich hab ein paar Zahlen, die per SQL in eine Datenbank geschrieben werden sollen.
    Wenn ich aber in meinem c++ Programm einfach schreibe: Select from...
    dann bringt er tausend Fehler.

    (Ich benutze das Visual C++, komm mit diesen Anwendungsassistenten nicht zurecht und deshalb wollte ich es "händisch" machen.)

    Was muß ich noch machen?

    Danke Sandra



  • Original erstellt von sandra:
    **Was muß ich noch machen?
    **

    Dir das hier durchlesen:
    Wohin mit meiner Frage?

    Da Du wohl MFC nimmst, verschiebe ich den Beitrag dorthin. Ratschlag: versuche den Assistenten zu verstehen, ohne ist die Sache mit CRecordset in der MFC ziemlich umständlich.



  • Zuerst mal. Welche Datenbank ?
    Access,MYSQL,MS-SQLSERVER,Oracle,etc.



  • Hallo,

    Ich benutze eine Access-Datenbank.

    Die ODBC-Treiber habe ich schon eingerichtet.



  • Also ich macht das immer per "Hand".

    #include <afxdb.h>
    
    class CNumber_Tbl: public CRecordset
    {
    
    public:
    // Art der Felder
    
        long    m_Nr;
        CString m_Number;
        double  m_Tarif;
        CString m_Password;
        int     m_AccessTimeout;
        CString m_HoleNumber;
        float   m_R_ckverg_tung;
        float   m_Provision;
        CString m_Provisionsart;
    
        CNumber_Tbl(CDatabase *pdb) :
          CRecordset(pdb)
        {
    
        m_Nr = 0;
        m_Number = _T("");
        m_Tarif = 0.0;
        m_Password = _T("");
        m_AccessTimeout = 0;
        m_HoleNumber = _T("");
        m_R_ckverg_tung = 0.0f;
        m_Provision = 0.0f;
        m_Provisionsart = _T("");
        m_nFields = 9; // Anzahl der felder in der Access
        }
    
        virtual void DoFieldExchange( CFieldExchange* pFX )
        {
    //  Fuer Datenaustausch
    //In Eckigen Klammern die Feldnamen in Access.
        pFX->SetFieldType(CFieldExchange: :outputColumn);
        RFX_Long(pFX, _T("[Nr]"), m_Nr);
        RFX_Text(pFX, _T("[Number]"), m_Number);
        RFX_Double(pFX, _T("[Tarif]"), m_Tarif);
        RFX_Text(pFX, _T("[Password]"), m_Password);
        RFX_Int(pFX, _T("[AccessTimeout]"), m_AccessTimeout);
        RFX_Text(pFX, _T("[HoleNumber]"), m_HoleNumber);
        RFX_Single(pFX, _T("[Rückvergütung]"), m_R_ckverg_tung);
        RFX_Single(pFX, _T("[Provision]"), m_Provision);
        RFX_Text(pFX, _T("[Provisionsart]"), m_Provisionsart);
        }
    };
    

    Zugriff ueber

    CString sODBCName = "Hier ODBC DSNNAME";
    CDatabase dbnumber;
    CNumber_Tbl number(&dbnumber);
    
            dbnumber.Open(sODBCName);
                if(dbnumber.IsOpen())
                {
                    number.Open(CRecordset::snapshot, "select * from ");
                    if (number.IsBOF())
                    {
                    }
                    else
                    {
                                            while(!number.IsEOF())
                        {
        // number.m_irgendwas stehen die daten
                            number.MoveNext();
                        }
                    }
                dbnumber.Close();
                }
    


  • Hi Sandra,

    CRecordset eignet sich wirklich ganz gut, um auf eine MSA-DB zuzugreifen. Hab das auch so gemacht. Hatte am Anfang wirklich so meine Schwierigkeiten [hab noch nie eine DB-Schnittstelle geschrieben], aber mit der Zeit gewöhnt man sich ein.

    Wenn Du irgendwelche Fragen hast - und scheinen sie auch noch so simpel - immer her damit, das geht anfangs jedem so!



  • hey unix tom du bist echt klasse !!!!

    endlich mal einer der mir sagt, daß ich nicht unbedingt CRecordView als Ansichtsklasse benutzen muss, sondern die daten per hand über die klasse CRecordset auch beliebig ansprechen kann.
    nun jetzt noch zwei fragen dazu:
    1. kann ich mehrere tabellen von CRecordSet offen haben, oder macht ihr das immer so, dass ihr die daten einlest und danch die Datenbank wieder schließt. (möchte die datenbank in echtzeit akztualisieren)
    2. ist es nicht besser mit CDAORecordSet bei einer Access-Datenbank zu arbeiten ?



  • Vielen, vielen Dank für die tolle Hilfe!!

    Ciao

    Sandra images/smiles/icon_biggrin.gif



  • morgen,

    Meines Wissens kann man auch mehrere Tabellen geöffnet haben! einfach mal ausprobieren!!

    CU



  • Man muß nicht die Datenverbindung schließen um ein neues SQL-Statment zu senden.

    Ein

    number.Close();
    Reicht um das recordset zu löschen um eine neues zu senden.
    Man brauchgt jedoch für jeden Table in der DB eine eigene Klasse da man die Anzahl der Felder und die Feldnamen braucht.
    Es gibt sicherlich viele Befehle wo man dies nicht braucht aber da wir es kompliziert (Feldnamen auslesen, Typ auslesen, Variablen zur Laufzeit erstellen, etc.)

    Für eine 2te instanz des selben Tables
    CDatabase dbnumber;
    CDatabase dbnumber1;



  • CDatabase kann auch sehr hilfreich sein


Anmelden zum Antworten