steffen22 Geschrieben 1. Dezember 2005 Geschrieben 1. Dezember 2005 Hallo zusammen! Ich würde gerne auf eine MySQL DB zugreifen aus einer MFC Anwendung. Klappt auch soweit. Ich verwende die OLE DB Schnittstelle. Um eine Query abzusenden verwende ich den "CCommand<CAccessor<TableBLA> >Query;". Aber nun zu meinem Problem: Wie mache ich das mit joins usw. also mit komplexeren anfragen? da kann ich ja nicht eindeutig angeben wie das result aussehen wiord; also welche Table ich angeben kann bei dem CAccessor... Wäre nett wenn mir jemand von euch helfen könnte MfG Steffen Zitieren
Guybrush Threepwood Geschrieben 1. Dezember 2005 Geschrieben 1. Dezember 2005 Naja du führst doch irgendwo deinen SQL Befehl aus und da kannst du das ja dann dem entsprechend angeben oder hab ich dich jetzt falsch verstanden? Bzw. hab ich das mal ohne MFC gemacht und da ging das dann über die folgenden Interfaces: IDBCreateSession IDBCreateCommand ICommandText Zitieren
bigpoint Geschrieben 2. Dezember 2005 Geschrieben 2. Dezember 2005 Wie mache ich das mit joins usw. also mit komplexeren anfragen? Mache so was nie von c++ aus. Dafür sind im DB Funktionen und Prozeduren da. Zitieren
Klotzkopp Geschrieben 2. Dezember 2005 Geschrieben 2. Dezember 2005 Wie mache ich das mit joins usw. also mit komplexeren anfragen? da kann ich ja nicht eindeutig angeben wie das result aussehen wiord; also welche Table ich angeben kann bei dem CAccessor...Solche Accessoren kannst du nicht mit dem Wizard erzeugen, aber du kannst diese Klassen von Hand anlegen. Du brauchst einen Datenmember für jedes Feld des Ergebnisses, eine Column Map, für parametrierte Abfragen eine Param Map, und mit dem DEFINE_COMMAND-Makro kannst du das SQL-Statement festlegen. Such einfach mal in der MSDN Library nach DEFINE_COMMAND oder BEGIN_COLUMN_MAP. Zitieren
steffen22 Geschrieben 2. Dezember 2005 Autor Geschrieben 2. Dezember 2005 Vielen Dank für eure Antworten! Wie gesagt es funzt ja alles mit einfachen querys. aber mir geht es ja um komplexe querys. Mache so was nie von c++ aus. Dafür sind im DB Funktionen und Prozeduren da. @bigpoint: Kannst du mir bitte genauer sagen wie das gehen soll? MfG Steffen Zitieren
Klotzkopp Geschrieben 2. Dezember 2005 Geschrieben 2. Dezember 2005 Wie gesagt es funzt ja alles mit einfachen querys. aber mir geht es ja um komplexe querys. Wo ist denn das Problem? Ich habe dir doch gesagt, wie du vorgehen musst. Zitieren
bigpoint Geschrieben 2. Dezember 2005 Geschrieben 2. Dezember 2005 Ja nach dem was das QSL Stetment mache soll/muss sollte man eben aus performenc gründen Datenbank Funktionen oder Prozeduren benutzen. z.B. Du packst deine „komplizierte“ Query in eine Funktion die liefert dir zurück eine Tabelle (Spalten von deinem Query) Den Rest sehe Klotzkopp Anleitung. Wills du unbedingt den Wizard benutzen dann statt Funktion einfach eine Sicht in DB Erstellen und denn Rest kennst du doch selbst Zitieren
steffen22 Geschrieben 2. Dezember 2005 Autor Geschrieben 2. Dezember 2005 Hallo! Also zur verständniss meines Problems Poste ich mal meine Code mit: /* ################### Tabellen und ihre Strukturen ####################################### */ #if !defined(TABLES_H) #define TABLES_H //Tabelle WERTE1 class TWerte1 { public: unsigned long m_ID; TCHAR m_sName[201]; BEGIN_COLUMN_MAP(TWerte1) COLUMN_ENTRY(1, m_ID) COLUMN_ENTRY(2, m_sName) END_COLUMN_MAP() void ClearRecord() { memset(this, 0, sizeof(*this)); } }; #endif Des Weiteren: //Öffen einer Session etc... auf code verzichte ich hir //Query absenden CString sQuery = "blablablaba die query halt..."; CCommand<CAccessor<TWerte1> > Table; HRESULT hr = Table.Open(m_Session, sQuery); //nun habe ich das ergebnis der Query in "Table" Mein Problem ist nun: Wenn ich ne Query mache z.B: SELECT tabelle1.Name, tabelle2.landkreis FROM Personendaten tabelle1, allgemeineDaten tabelle2 Dann bekomme ich als ergebniss ne tabelle welche ne mischung zwischen den tabellen Personendaten und allgemeinenDaten ist. Somit kann ich bei dem CAccessor keine Table angeben! Ich hoffe nun ist verständlich was mein problem ist. Ich versuche es nochmal in Worte zu fassen: Da ich durch eine "verschachtelte" Query keine Class bei dem Template/Klasse CACCESSOR angeben kann, würde ich gerne wissen wie ich das mache sodass ich mit dem ergeniss der Query, welche ja eine Table zurückliefert, arbeiten kann! Vielen Dank Zitieren
Klotzkopp Geschrieben 2. Dezember 2005 Geschrieben 2. Dezember 2005 Wenn ich ne Query mache z.B: SELECT tabelle1.Name, tabelle2.landkreis FROM Personendaten tabelle1, allgemeineDaten tabelle2 Dann bekomme ich als ergebniss ne tabelle welche ne mischung zwischen den tabellen Personendaten und allgemeinenDaten ist.Wenn du nirgendwo eine WHERE-Klausel oder JOIN benutzt, bekommst du ein Kreuzprodukt aller verwendeten Tabellen. Das hat absolut nichts mit C++ zu tun, sondern liegt an deinem SQL-Statement. Da ich durch eine "verschachtelte" Query keine Class bei dem Template/Klasse CACCESSOR angeben kann,Das ist Unsinn. Der Templateparameter von CAccessor ist doch eine Klasse, egal wie dein Statement aussieht. würde ich gerne wissen wie ich das mache sodass ich mit dem ergeniss der Query, welche ja eine Table zurückliefert, arbeiten kann!Eine Abfrage liefert immer ein Recordset, keine Tabelle. Zitieren
steffen22 Geschrieben 2. Dezember 2005 Autor Geschrieben 2. Dezember 2005 HAllo Klotzkopp Das kann schon alles richtig sein was du geantwortet hast aber leider hilft mir das auch nicht weiter bei meinem problem. Falls ich mal eine query machen muss, welche mir das ergebnis aus 2 Tables zusammen würfelt.... was mache ich dann? Vielleicht bin auch nur schwer von begriff und du flippst gleich aus wegen meinen posts hier Zitieren
Klotzkopp Geschrieben 2. Dezember 2005 Geschrieben 2. Dezember 2005 Falls ich mal eine query machen muss, welche mir das ergebnis aus 2 Tables zusammen würfelt....Das ist ja schon im Ansatz schlecht. Du willst sicher nichts zusammengewürfeltes, sondern die Ergebnisse sollen die Datensätze beider Tabellen unter bestimmten Bedingungen enthalten. Welche sind das? Wie gut kennst du SQL? Kennst du WHERE und JOIN? Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.