MFC ODBC Driver Problem
-
MFC ODBC Driver Problem
#1Hallo
ich habe ein Problem mit der Anbindung des ODBC Driver an mein MFC - Programm.
Es wird zwar jetzt schwer euch das zu erläutern, aber ich hoffe Ihr könnt mir trotzdem helfen.
Los geht'sIch habe eine MFC - Musik_Datenbank geschrieben in der ich :
- Lieder suchen kann
- Lieder sortieren kann (Auf -und Abwärts)
- In der ich Lieder abspeichern kann
- und in der ich die vorhandenen Lieder auch aus Drucken kann.So mein Problem spielt sich in der Class MusicManagement ab. Die anderen Klassen sind denk ich mal egal, wenn nicht bescheid sagen.
Meine MusicManagement.h sieht folgendermaßen aus:
Code:[code] // MusicManagement.h: Schnittstelle für die Klasse MusicManagement. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_MUSICMANAGEMENT_H__131925CB_F56E_4294_A73C_8D4FA8629802__INCLUDED_) #define AFX_MUSICMANAGEMENT_H__131925CB_F56E_4294_A73C_8D4FA8629802__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "MusicCollection.h" [b]#include "tblDatenbank.H"[/b] // Libary der Class class MusicManagement { public: MusicCollection m_MusicCollection; [b]CtblDatenbankAccessor music;[/b] // Variable der Class public: MusicManagement(); virtual ~MusicManagement(); void LoadData(); void AddNewSong(MusicPiece NewSong); void StoreData(); void ReadDB(); [b]void StoreDB(MusicPiece NewSong);[/b] // Methode in der Class aufgerufen wird }; #endif // !defined(AFX_MUSICMANAGEMENT_H__131925CB_F56E_4294_A73C_8D4FA8629802__INCLUDED_)[/code]
Die markierten Felder sind die um die es sich hauptsächlich drehen soll.
Den Variablentyp music nutze ich, da sich die Methode ja in der MusicManagement.cpp befindet und ich eine Verbindung zur ODBC Class brauche.
In meiner MusicManagement.cpp kann ich auch auf alles zugreifen.
An meine ODBC Class habe ich CRecordset vererbt um über music gleichseitig auch an AddNew usw. zugelangen. Wie ich die ODBC Class eingerichtet habe findet Ihr unter:http://www.codeproject.com/database/oledbconsumer1.asp
Nun dachte ich eigentlich das es funktioniert aber nichts da, ich habe sehr komische Fehlermeldungen bekommen:
c:\programme\microsoft visual studio\vc98\atl\include\atldbcli.h(2862) : Bei der Kompilierung der Member-Funktion 'void __thiscall ATL::CAccessorRowset<class ATL::CAccessor<class CtblDatenbankAccessor>,class ATL::CRowset>::Close(void)' der Klassenvorlage
Diese Fehlermeldungen tauchen alle an der gleichen Stelle in der ATLDBCLI.H auf und zwar genau hier:
void Close() { if (GetInterface() != NULL) { ReleaseAccessors(GetInterface()); TAccessor::Close(); TRowset::Close(); } }
Hat das jetzt jemand verstanden und kann mir helfen
Gruss Silver
-
Silvercreast schrieb:
Nun dachte ich eigentlich das es funktioniert aber nichts da, ich habe sehr komische Fehlermeldungen bekommen:
c:\programme\microsoft visual studio\vc98\atl\include\atldbcli.h(2862) : Bei der Kompilierung der Member-Funktion 'void __thiscall ATL::CAccessorRowset<class ATL::CAccessor<class CtblDatenbankAccessor>,class ATL::CRowset>::Close(void)' der Klassenvorlage
Das ist nicht die ganze Fehlermeldung. Die Zeile mit der Fehlernummer ist entscheidend.
-
Und wo finde ich den Rest, das ist alles was der Compiler mir an Fehlermeldung gegeben hat
-
Silvercreast schrieb:
das ist alles was der Compiler mir an Fehlermeldung gegeben hat
Unwahrscheinlich. Da ist nämlich keine Fehlernummer drin (C1234 oder so). Die steht vermutlich darüber.
-
kann das sein das du die nummer hinter dem error meinst
Und zwar C2385
-
Silvercreast schrieb:
Und zwar C2385
Wenn das, was du vorher geschrieben hast, angeblich alles war, dann frage ich mich, wo du jetzt diese Nummer hergezaubert hast...
Und jetzt bitte die vollständige Meldung. Vielleicht klappt's ja im dritten Anlauf
-
Frag mich mal was leichteres
c:\programme\microsoft visual studio\vc98\atl\include\atldbcli.h(2866) : error C2385: 'CAccessor<class CtblDatenbankAccessor>::Close' ist mehrdeutig
c:\programme\microsoft visual studio\vc98\atl\include\atldbcli.h(2862) : Bei der Kompilierung der Member-Funktion 'void __thiscall ATL::CAccessorRowset<class ATL::CAccessor<class CtblDatenbankAccessor>,class ATL::CRowset>::Close(void)' der Klassenvorlage
Wie kannst du das eigentlich an der Nummer feststellen.
Sorry das ich dir erst jetzt schreibe
Gruss Silver
-
Silvercreast schrieb:
Wie kannst du das eigentlich an der Nummer feststellen.
Was? Dass die Fehlermeldung unvollständig war? Jeder Fehlermeldung beginnt mit error Cxxxx:.
Das ist übrigens immer noch nicht die ganze Meldung. Die nachfolgenden Zeilen bis zum nächsten "error" gehören auch noch dazu.Bisher kann ich nur sagen, dass TRowset::Close mehrdeutig ist. Wie sieht denn die Deklaration von CtblDatenbankAccessor aus?
-
Nein ich meinte wie du an Hand der Nummer den Fehler erkennst??
Das andere es darf doch eigentlich gar nicht sein das ich in der ATLDBCLI.H was ändern muss oder?? Ich habe übrigens den Fehler gelöst, ich musste CRecordset:: vor das Close schreiben also:void CRecordset::close()
Jetzt habe ich ganz viele andere Fehler
unteranderem den den du genannt hast, jetzt weiss ich überhaupt nicht mehr weiter
gruss Silver
-
Silvercreast schrieb:
Nein ich meinte wie du an Hand der Nummer den Fehler erkennst??
Dazu sind die Nummern doch da.
Das andere es darf doch eigentlich gar nicht sein das ich in der ATLDBCLI.H was ändern muss oder??
Du DARFST in atlbdcli.h nichts ändern.
Ich habe übrigens den Fehler gelöst, ich musste CRecordset:: vor das Close schreiben also:
"Gelöst" würde ich das nicht nennen. Lass die Finger von Systemheaderdateien.
Jetzt habe ich ganz viele andere Fehler
Wundert mich nicht.
jetzt weiss ich überhaupt nicht mehr weiter
Zweiter Versuch:
Wie sieht denn die Deklaration von CtblDatenbankAccessor aus?Kann es sein, dass du MFC-ODBC und ATL-OLEDB-Consumer wild gemischt hast?
-
MFK schrieb:
Dazu sind die Nummern doch da.
Ja aber wie weiss ich welche Fehlermeldung für welchen Fehler steht
Du DARFST in atlbdcli.h nichts ändern.
Hab ich ja gesagt
"Gelöst" würde ich das nicht nennen. Lass die Finger von Systemheaderdateien.
Ganz schnell die Lösung gelöscht
Zweiter Versuch:
Wie sieht denn die Deklaration von CtblDatenbankAccessor aus?class CtblDatenbankAccessor : public CRecordset //CRecordset darf ich wahrscheinlich auch net Vererben :rolleyes: { public: LONG m_IDPKDatenbank; TCHAR m_Regal[51]; TCHAR m_Interpret[51]; TCHAR m_Titel[51]; TCHAR m_Rubrik[51]; TCHAR m_CD[51]; BEGIN_COLUMN_MAP(CtblDatenbankAccessor) COLUMN_ENTRY(1, m_IDPKDatenbank) COLUMN_ENTRY(2, m_Regal) COLUMN_ENTRY(3, m_Interpret) COLUMN_ENTRY(4, m_Titel) COLUMN_ENTRY(5, m_Rubrik) COLUMN_ENTRY(6, m_CD) END_COLUMN_MAP() // Sie können diese Funktion aufrufen, wenn Sie einen Datensatz einfügen und Sie // alle Felder initialisieren wollen, wenn Sie nicht alle von diesen explizit setzen. void ClearRecord() { memset(this, 0, sizeof(*this)); } };
Kann es sein, dass du MFC-ODBC und ATL-OLEDB-Consumer wild gemischt has
Zwt?Das kann sehr gut sein da ich das speichern nach diesem link der oben ist gemacht habe.
Kannst du mir bei meinem Kuddelmuddel helfen???
-
Silvercreast schrieb:
Ja aber wie weiss ich welche Fehlermeldung für welchen Fehler steht
MSDN Library.
Das kann sehr gut sein da ich das speichern nach diesem link der oben ist gemacht habe.
Da steht aber nichts von CRecordset. Der Link beschreibt ATL OLEDB consumer templates. Das ist weder MFC noch ODBC, da hat CRecordset nichts zu suchen.
Du musst dich entscheiden, welche Datenbankschnittstelle du benutzen willst.
-
Ja dann die ODBC weil das laden funktioniert ja schon.
Das Problem ist nur ich hab mir die informationen von verschiedenen Seiten geholt.
Und ich dachte, das bei Codeproject die anleitung für ODBC gilt. Da ich ja den ODBC Driver hinzufügen musste.Muss ich jetzt die ALTDBCLI.H und die tblDatenbank.H löschen??
Und was muss ich denn dann machen??
-
Wenn du ODBC der MFC benutzen willst brauchst du nur die afxdb.h einbinden (wird automatisch in der stdafx.h gemacht, wenn du beim Projekt "Datenbankunterstützung hinzufügen" eingeklickert hattest.
So und dann brauchst du eigentlich nur noch die Klassen CDatabase und CRecordSet. Wie die zu benutzen sind, steht inkl. beispielen in der MSDN Library..
Was hast du denn genau vor? Daten aus Tabellen lesen/speichern ?
-
Ja ich habe eine klitze kleine Access Datenbank mit einer Tabelle und dir will ich lesen und speichern das lesen funktioniert ja schon nur das speichern noch nicht.
-
Dann hast du zwei Möglichkeiten:
1. einen SQL-Insert schreiben (generieren) und mit CDatabase::ExecuteSQL abschicken.
2. ein CRecordset aufmachen (mit Open, genau wie beim lesen) und dann einfach mit CRecordset::AddNew eine weitere Zeile einfügen, Werte zuweisen und dann mit CRecordset::Update das ganze commiten (abschliessen).
-
Ja das mit dem AddNew kenn ich ja , das Problem wie komm ich an meine Datenbank Variablen ran ?? Irgendwie muss ich doch die Daten in diese Variablen packen??