bigpoint Geschrieben 3. Januar 2003 Geschrieben 3. Januar 2003 Ich greife auf DB mit ADO: // COM-Umgebung initialisieren ::CoInitialize(NULL); try { // ADO Berechtigung CreateInstance von Connection pConn.CreateInstance(__uuidof(Connection)); // ADO Berechtigung CreateInstance von Command pCmd.CreateInstance(__uuidof(Command)); // Datensatzobjekt erzeugen von Recordset m_pRs.CreateInstance(__uuidof(Recordset)); // Datensatzobjekt öffnen pConn->Open(bstrConnection,L"sa",L"", adOpenUnspecified); pCmd->ActiveConnection = pConn; pCmd->CommandText = bstrCmdText;//“select *from irgendwas“ //m_pRs = pCmd->Execute(); m_pRs->PutRefSource(pCmd); // NULL vom Typ Variant erzeugen _variant_t vNull; vNull.vt = VT_ERROR; vNull.scode = DISP_E_PARAMNOTFOUND; // Recordset öffnen m_pRs->Open(vNull, vNull, adOpenDynamic, adLockOptimistic, adCmdUnknown); // Zeiger auf Bindungsschnittstelle des Datensatzes holen if (FAILED(m_pRs->QueryInterface(__uuidof(IADORecordBinding),(LPVOID *)&m_piAdoRecordBinding))) _com_issue_error(E_NOINTERFACE); // Datensatzklasse an Recordset binden m_piAdoRecordBinding->BindToRecordset(&m_rsRecSet); } // Fehler vorhanden? catch (_com_error &e) { // Fehler anzeigen GenerateError(e.Error(), e.Description()); } durch pCmd->CommandText = bstrCmdText;//“select *from irgendwas“ kann ich eine Tabelle auslesen und die Daten anzeigen, was mache ich aber wenn ich noch auf eine andere Tabelle zugreifen will muß ich noch ein Recordset und Command deklarieren oder wie geht’s kann mir jemand es beantworten oder mein Quellcod anpassen Vielen Dank Zitieren
bigpoint Geschrieben 4. Januar 2003 Autor Geschrieben 4. Januar 2003 Es ist eigentlich so, ich habe alles doppelt deklariert und es scheint zu funktionieren, allerdings auf DB greife ich in der Methode OnNewDocument() zu wie oben gesehen. Die Daten verende, bearbeite usw. in View wehre aber für mich logischer wenn man alles in View macht ?? Wenn ich zB ein SQL-Anweisung in View ausführen will muß ich zurück auf Dokument zugreifen Command Objekt holen usw. Da ist auch mein Problem denn wenn ich alles doppelt inizializie muß ich auch zwei zeiger auf Document initialisiere und ich weis nicht wie also einen Zeiger initialisiere ich so // Zeiger auf die Variable der Datensatzklasse zurückgeben CCustomRs* CTAKDoc::GetRecSet() { // Zeiger auf das Datensatzobjekt zurückgeben return &m_rsRecSet; } aber was ist mit dem zweitem den so geht es leider nicht // Zeiger auf die Variable der Datensatzklasse zurückgeben CTestRs* CTAKDoc::GetRecSet() { // Zeiger auf das Datensatzobjekt zurückgeben return &m_rstest; } Wie ist es normalerweise ???? Zitieren
Klotzkopp Geschrieben 4. Januar 2003 Geschrieben 4. Januar 2003 Originally posted by 007ski aber was ist mit dem zweitem den so geht es leider nicht Was heißt "so geht es leider nicht"? Compilerfehler? Laufzeitfehler? Nicht das gewünschte Verhalten? Bitte gewöhne dir doch an, bei Fehlern den vollständigen Fehlermeldungstext oder eine genaue Fehlerbeschreibung anzugeben. Umso besser kann dir geholfen werden. Und bitte verwende die Code-Tags, damit man deinen Code besser lesen kann. Ich vermute, dass der Compiler sich darüber beschwert, dass du in der Klasse CTAKDoc zweimal die Methode GetRecSet deklarierst, und die beiden sich nur im Rückgabetyp unterscheiden. Das ist nicht erlaubt. Gib einer der Methoden einen anderen Namen. Zitieren
bigpoint Geschrieben 4. Januar 2003 Autor Geschrieben 4. Januar 2003 Sorry, natürlich möchte ich mich so gut wie möglich ausdrucken leider muß ich noch daran arbeiten genau so wie mit MFC, aber vielleicht irgendwann schaffe ich beides Ja es stimmt das der Compeiler hat problemme mit GetRecSet() die zwei mal in CTAKDoc deklariert wird. Ich habe einfach einen anderen Namen vergeben und schon funk ;-) Ich habe aber noch einen anderen Problem ( wie sollte es den anderes sein ). Wo ich jetzt auf mehre Tabellen zugreifen kann und die Daten auslesen ist es so, dass ich auch mehrere SQL-Abfragen schreiben will und dann das Resultat haben. Wo und wie muß ich die SQL-Abfragen aber schreiben ( am besten wehre es für mich es in View tun ) Bis jetzt tue ich es doch in Document pCmd->CommandText = bstrCmdText;//“select *from irgendwas“ //m_pRs = pCmd->Execute(); m_pRs->PutRefSource(pCmd); // NULL vom Typ Variant erzeugen _variant_t vNull; vNull.vt = VT_ERROR; vNull.scode = DISP_E_PARAMNOTFOUND; // Recordset öffnen m_pRs->Open(vNull, vNull, adOpenDynamic, adLockOptimistic, adCmdUnknown); [/PHP] somit kriege ich doch alle Daten von irgendwas wie komme ich auf z.B. “select kundeid from irgendwas where kundeid = 1“ normaler weise sollte ich als Ergebnis 1 kriegen. Muss ich jedes mal neuen Command deklarieren und jedes mal Recordset öffnen Zitieren
Klotzkopp Geschrieben 5. Januar 2003 Geschrieben 5. Januar 2003 Ich denke, du kannst einfach dem CommandText-Property des Command-Objekts ein anderes SQL-Statement zuweisen. Du musst aber darauf achten, dass die einzelnen Felder des Abfrageergebnisses auch auf das RecordSet-Objekt passen. Wenn du die Abfrage an ein Recordset bindest (BindToRecordset), und die Ergebnisfelder der Abfrage nicht auf die Membervariablen des Recordsets passen, wird das nicht funktionieren. Originally posted by 007ski “select kundeid from irgendwas where kundeid = 1“Für diese Abfrage brauchst Du also ein Recordset, das genau eine Feldvariable enthält, deren Datentyp auf den Datentyp von kundeid passen muss. Zitieren
bigpoint Geschrieben 5. Januar 2003 Autor Geschrieben 5. Januar 2003 Ich Frage einfach noch mal wo sollte man auf db zugreifen in Document oder View ???? Ist es wirklich so, dass ich jedes mal ein neuen Command-Objekts, Recordset-Objekts, IADORecordBinding- Objekts deklarieren muß, was bedeutet wenn ich 100 Abfragen habe, muß ich ............... ;( Ich habe doch nur eine Klasse wo mann auf Feldwerte zugreifen kann class CCustomRs : public CADORecordBinding { BEGIN_ADO_BINDING(CCustomRs) ADO_FIXED_LENGTH_ENTRY(1, adInteger, m_lAddressID, lAddressIDStatus, TRUE) ADO_FIXED_LENGTH_ENTRY(1, adInteger, m_ ifunktionID, lFunktionIDStatus, TRUE) ADO_FIXED_LENGTH_ENTRY(3, adDate, m_dtBirthdate, lBirthdateStatus, TRUE) ADO_FIXED_LENGTH_ENTRY(4, adBoolean, m_bSendCard, lSendCardStatus, TRUE) END_ADO_BINDING() public: LONG m_lAddressID; ULONG lAddressIDStatus; CHAR m_szFirstName[51]; ULONG lFirstNameStatus; DATE m_dtBirthdate; ULONG lBirthdateStatus; VARIANT_BOOL m_bSendCard; ULONG lSendCardStatus; }; und wenn ich schreibe in Document alles doppelt mit “select addressid from irgendwas where addressid = 1“ und am ende m_piAdoRecordBinding1->BindToRecordset(&m_rsBer);// m_rsBer zeiger auf CcustomRs (wenn ich neue Abfrage schreibe die wieder auf CcustomRs sich bezieht sollte es so ausschauen: m_piAdoRecordBinding1->BindToRecordset(&m_rsBer) und dann im View CCustomRs * pcrs; pcrs = GetDocument()->GetRecSet1(); int m_lAddressID; int m_ifunktionID; if(adFldOK == pberechtigung->lBenutzerIDStatus) m_lAddressID = pcrs ->m_BenutzerID; else m_lAddressID = 0; if(adFldOK == pberechtigung->lFunktionIDStatus) m_ifunktionID = pcrs ->FunktionID; else m_ifunktionID = 0; [/PHP] dann kriege ich sowohl in m_lAddressID als m_ifunktionID Werte laut aber SQL Abfrage sollte nur was im m_lAddressID stehen, oder ????? Zitieren
Klotzkopp Geschrieben 5. Januar 2003 Geschrieben 5. Januar 2003 Originally posted by 007ski Ich Frage einfach noch mal wo sollte man auf db zugreifen in Document oder View ????So, wie die Doc/Viewarchitektur gedacht ist, sollte sich die View um die Darstellung und die Dokumentklasse um die Datenhaltung kümmern. Dazu gehört auch die Interaktion mit einer Datenbank. Es zwingt dich aber niemand, dich daran zu halten. Wenn die "Dokumente" nicht geladen und gespeichert werden sollen, und es nur eine Art von View gibt, kannst du auch alles in der Viewklasse machen. Ist es wirklich so, dass ich jedes mal ein neuen Command-Objekts, Recordset-Objekts, IADORecordBinding- Objekts deklarieren muß, was bedeutet wenn ich 100 Abfragen habe, muß ich ............... ;(Wenn Du 100 unterschiedliche Abfragen hast (unterschiedlich in der Art und Anzahl der Felder des Abfrageergebnisses), dann brauchst Du 100 Recordset-Klassen. Die anderen Objekte kannst du ja problemlos erzeugen. <snip>...dann kriege ich sowohl in m_lAddressID als m_ifunktionID Werte laut aber SQL Abfrage sollte nur was im m_lAddressID stehen, oder ????? Schau dir die Implementierung dieser Recordset-Klasse doch an. Da stehen Anweisungen, wie insgesamt vier Felder an Variablen der Recordsetklasse gebunden werden. Wie soll diese Klasse funktionieren, wenn du eine Abfrage verwendest, die nur ein Feld liefert? Die Anzahl und Reihenfolge der Einträge zwischen BEGIN_ADO_BINDING und END_ADO_BINDING müssen zu dem passen, was die Abfrage liefert. Zitieren
bigpoint Geschrieben 6. Januar 2003 Autor Geschrieben 6. Januar 2003 Originally posted by Klotzkopp und es nur eine Art von View gibt warum nur eine Art (bei mir sind es zwei) Originally posted by Klotzkopp Die anderen Objekte kannst du ja problemlos erzeugen. Wie, ich denke man muss alles bis auf Connection 100 mal deklarieren auch die klasse mit BEGIN_ADO_BINDING und END_ADO_BINDING ??? QUOTE]Originally posted by Klotzkopp Schau dir die Implementierung dieser Recordset-Klasse doch an. Da stehen Anweisungen, wie insgesamt vier Felder an Variablen der Recordsetklasse gebunden werden. Wie soll diese Klasse funktionieren, wenn du eine Abfrage verwendest, die nur ein Feld liefert? Zitieren
Klotzkopp Geschrieben 6. Januar 2003 Geschrieben 6. Januar 2003 Du kannst bei ADO auch dynamisch binden. Hier habe ich ein kleines Tutorial dazu gefunden. Zitieren
bigpoint Geschrieben 6. Januar 2003 Autor Geschrieben 6. Januar 2003 wie meinst Du, welche Methode für DB Zugrief die "beste" ist 1 OLE DB 2 ADO 3 ODBC 4 oder ?? einfach so allgemein Vielen Dank 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.