Problem mit CRecordSet HILFE BITTE



  • Morgen!

    habe doch schon ne Klasse von CRecordset abgeleitet und einer DB zugeordnet!
    bzw das hat ja schon alles der Entwurfs / Anwendungsassistent von M V C++ 6 gemacht.
    Das funktioniert ja auch wunderbar!! nur wenn ich halt den recordset öffnen will, nachdem ich die Anwendung compiliert und ausgeführt habe, verlangt dieser in meiner Anwendung das ich ne Datenquelle auswählen soll.
    Vielleicht hast du ja noch ne idee!
    THX
    cu Bart



  • Zeige mal deine von CRecordSet abgeleitete Klasse...



  • also, im code musst du rs nicht als crecordset objekt, sondern als objekt der klasse, in der deine datenbank eingebunden ist. wenn du das über den assisstenten gemacht, dürfte das in ...View die Variable m_pSet sein.
    ausserdem bin ich nicht sicher, ob dein sql-statement in der open-klausel funktioniert. ich glaube, dass du das besser vorher in einen cstring packst und dann übergibst



  • tagchen!

    Also nachfolgend der Code der von CRecordSet abgeleiteten Klasse WebschefSet
    Zuerst die WebschefSet.h

    // webschefSet.h : Schnittstelle der Klasse CWebschefSet
    //
    /////////////////////////////////////////////////////////////////////////////
    
    #if !defined(AFX_WEBSCHEFSET_H__2D97FDCB_B67D_4324_82EF_78746EBEBC23__INCLUDED_)
    #define AFX_WEBSCHEFSET_H__2D97FDCB_B67D_4324_82EF_78746EBEBC23__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    class CWebschefSet : public CRecordset
    {
    public:
    	CWebschefSet(CDatabase* pDatabase = NULL);
    	DECLARE_DYNAMIC(CWebschefSet)
    
    // Feld-/Parameterdaten
    	//{{AFX_FIELD(CWebschefSet, CRecordset)
    	CString	m_IP_Adresse;
    	CString	m_Vorname;
    	CString	m_Nachname;
    	CString	m_Hostname;
    	CString	m_Status;
    	CString	m_Geb_ude;
    	CString	m_Zimmernummer;
    	CString	m_Fakult_t;
    	//}}AFX_FIELD
    
    // Überladungen
    	// Vom Klassenassistenten generierte Überladungen virtueller Funktionen
    	//{{AFX_VIRTUAL(CWebschefSet)
    	public:
    	virtual CString GetDefaultConnect();	// Standard-Verbindungszeichenfolge
    	virtual CString GetDefaultSQL(); 	// Standard-SQL für Recordset
    	virtual void DoFieldExchange(CFieldExchange* pFX);	// RFX-Unterstützung
    	//}}AFX_VIRTUAL
    
    // Implementierung
    #ifdef _DEBUG
    	virtual void AssertValid() const;
    	virtual void Dump(CDumpContext& dc) const;
    #endif
    
    };
    
    //{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ fügt unmittelbar vor der vorhergehenden Zeile zusätzliche Deklarationen ein.
    
    #endif // !defined(AFX_WEBSCHEFSET_H__2D97FDCB_B67D_4324_82EF_78746EBEBC23__INCLUDED_)
    

    Nun folgt die entsprechende WebschefSet.cpp:

    // webschefSet.cpp : Implementierung der Klasse CWebschefSet
    //
    
    #include "stdafx.h"
    #include "webschef.h"
    #include "webschefSet.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    /////////////////////////////////////////////////////////////////////////////
    // CWebschefSet Implementierung
    
    IMPLEMENT_DYNAMIC(CWebschefSet, CRecordset)
    
    CWebschefSet::CWebschefSet(CDatabase* pdb)
    	: CRecordset(pdb)
    {
    	//{{AFX_FIELD_INIT(CWebschefSet)
    	m_IP_Adresse = _T("");
    	m_Vorname = _T("");
    	m_Nachname = _T("");
    	m_Hostname = _T("");
    	m_Status = _T("");
    	m_Geb_ude = _T("");
    	m_Zimmernummer = _T("");
    	m_Fakult_t = _T("");
    	m_nFields = 8;
    	//}}AFX_FIELD_INIT
    	m_nDefaultType = snapshot;
    }
    
    CString CWebschefSet::GetDefaultConnect()
    {
    	return _T("ODBC;DSN=Adressbuch");
    }
    
    CString CWebschefSet::GetDefaultSQL()
    {
    	return _T("[Adressen]");
    }
    
    void CWebschefSet::DoFieldExchange(CFieldExchange* pFX)
    {
    	//{{AFX_FIELD_MAP(CWebschefSet)
    	pFX->SetFieldType(CFieldExchange::outputColumn);
    	RFX_Text(pFX, _T("[IP Adresse]"), m_IP_Adresse);
    	RFX_Text(pFX, _T("[Vorname]"), m_Vorname);
    	RFX_Text(pFX, _T("[Nachname]"), m_Nachname);
    	RFX_Text(pFX, _T("[Hostname]"), m_Hostname);
    	RFX_Text(pFX, _T("[Status]"), m_Status);
    	RFX_Text(pFX, _T("[Gebäude]"), m_Geb_ude);
    	RFX_Text(pFX, _T("[Zimmernummer]"), m_Zimmernummer);
    	RFX_Text(pFX, _T("[Fakultät]"), m_Fakult_t);
    	//}}AFX_FIELD_MAP
    }
    
    /////////////////////////////////////////////////////////////////////////////
    // CWebschefSet Diagnose
    
    #ifdef _DEBUG
    void CWebschefSet::AssertValid() const
    {
    	CRecordset::AssertValid();
    }
    
    void CWebschefSet::Dump(CDumpContext& dc) const
    {
    	CRecordset::Dump(dc);
    }
    #endif //_DEBUG
    

    Das im ersten Beitrag stehende SQL-Statement funktioniert so.

    rs.Open(CRecordset::forwardOnly,"SELECT * From Adressen WHERE "+s_ausw+"='"+s_input+"'",CRecordset::readOnly);

    Wie gesagt, mich stört, dass wenn ich auf den Button drücke, der die Funktion aufruft, ich extra noch meine Datenquelle über ein Windowsfenster auswählen muss!! Das habe ich doch aber schon eigentlich gemacht (siehe oben), oder nicht?
    Vielen DANK schonmal für eure Mühe und Hilfe!
    cu Bart



  • tagchen!!
    Habe mein Problem gerade selber gelöst!
    und zwar, wen es interessiert:
    statt:

    CRecordSet rs;
    

    habe ich :

    CWebschefSet rs;
    

    geschrieben.
    Ist auch irgendwie logischer (?).
    Aber meines Erachtens hatte ich das schonmal probiert und da hatte es nicht funktioniert! Naja egal jetzt gehts!
    Trotzdem vielen DANK für eure Hilfe und Mühe!
    cu Bart



  • ich nochmal!
    habe zwar das andere Problem gelöst! Aber hab schon wieder ein neues!
    ich würde gern meiner Access DB neue Datensätze hinzufügen! Aber das mit dem INSERT INTO ... klappt irgendwie nicht!
    Gibt es da irgendwas zu beachten??
    cu Bart



  • um der datenbank neue datensätze hinzuzufügen, schau dir am besten in der msdn die member von crecordset an. es geht zum beispiel über:
    [cpp]
    rs.AddNew();
    rs.VariablenName = irgendeinWert
    //für alle Variablen, die geändert werden sollen
    rs.Update();
    [cpp]
    aber ich glaube, um neue datensätze hinzuzufügen,musst du die datenbank mit CRecordset::dynaset oder snapshot öffnen...



  • Noch einen Hinweis für dich
    Schreib deine Standard SQL-Abfrage in GetDefaultSQL(). Somit musst du die Anweisung nicht in die Open() schreiben.

    CString CWebschefSet::GetDefaultSQL()
    {
        CString sSQL;
        sql.Format("SELECT * From Adressen WHERE %s = '%s'",s_ausw,s_input);
    
        return _T(sSQL);
    }
    

    Dein Aufruf:

    CWebschefSet rs;
    rs.Open(CRecordset::forward | CRecordset::snapshot,NULL);
    


  • tagchen!
    THX das hat mir alles geholfen!
    habe es wie folgt realisiert:

    CWebschefSet rs; 
    rs.Open(CRecordset::snapshot,NULL); 
    
    rs.AddNew(); 
    rs.m_IP_Adresse="135.25.1.66";
    rs.m_Nachname="TEST";
    rs.m_Status="135.25.1.66";
    rs.m_Hostname="thebest";
    rs.Update();
    

    mein Problem ist zur zeit noch, das ich ja gleich auf die Daten zugreifen möchte!
    Aber zur Zeit ist es so, dass ich mein Programm erst neu starten muss, ehe ich auf die Daten zugreifen kann, die ich in die DB eingefügt habe! Gibt es da noch ne andere Möglichkeit?? das irgendwie zu umgehen?
    THX cu Bart



  • versuch mal, die datenbank als dynaset zu öffnen. dann müssten der auf die daten sofort zugreifen können.
    alternativ:
    rs.Close();
    rs.Open(...)



  • rs.Requery(); tuts auch, steht doch sogar in Visual C++ in 21 Tagen... 🙄



  • tagchen!
    THX@all! hat funktioniert!
    also Danke für eure Mühe und Hilfe!
    cu Bart


Anmelden zum Antworten