Blueeye Geschrieben 5. April 2002 Geschrieben 5. April 2002 Hallo Leute! Bin gerade dabei einen Datenbankzugriff auf Oracle-Datenbanken MFC zu realisieren. Allerdings weiß ich nicht wie ich das ActiveX-Steuerelement "Microsoft ADO DATA Control" ansteuern muss. Soweit ich weiß, kann man dies über die Datei "adodc.cpp" und "adodc.h" auch manuell machen. Mein bisheriges Vorgehen: In der Funktion "CString CAdodc::GetConnectionString()" lese ich die Benutzerdaten(User, Pass) und den Hoststring aus einer .ini-Datei aus. In der darauf folgenden Funktion "void CAdodc::SetConnectionString()" setze ich dann den ConnectionString zusammen und übergebe diesen an den InvokeHelper. Erstellen des ConnectionString: void CAdodc::SetConnectionString() { char conn[1000]; strcpy(conn, "Provider=MSDAORA.1;Password = "); strcat(conn, pass); strcat(conn, ";User ID = "); strcat(conn, user); strcat(conn, ";Data Source="); strcat(conn, host); strcat(conn, ";Persist Security Info=True"); LPCTSTR lpszNewValue = conn; static BYTE parms[] = VTS_BSTR; InvokeHelper(0x1, DISPATCH_PROPERTYPUT,VT_EMPTY, NULL, parms, lpszNewValue); } Ich vermute, das der "InvokeHelper" den ConnectionString dann an das Steuerelement übergibt. Dies führt aber zu einem erheblichen Fehler. Allerdings verstehe ich auch nicht genau, was dieser InvokeHelper macht und welche Parameter er benötigt. Falls jemand von euch eine Idee hat oder weitere Informationen benötigt stehe ich euch gerne zur Verfügung. Schon mal vielen Dank im Vorraus!!!! Zitieren
Klotzkopp Geschrieben 6. April 2002 Geschrieben 6. April 2002 Mit einem LPCTSTR können Automation-Funktionen nichts anfangen. Wenn Du sagst, dass Du einen BSTR übergibst, dann musst Du das auch tun: CComBSTR bstrNewValue( conn ); InvokeHelper(0x1, DISPATCH_PROPERTYPUT,VT_EMPTY, NULL, parms, &bstrNewValue); Zitieren
Blueeye Geschrieben 8. April 2002 Autor Geschrieben 8. April 2002 Hi Klotzkopp, vorab schon mal vielen Dank. Allerdings bekomme ich noch immer die Fehlermeldung "Debug assertion failed". Weißt du vielleicht, welche Parameter "void CAdodc::SetConnectionString()" und "void CAdodc::SetRecordSource()" übergeben werden müssen, oder weißt du einen Weg, wie ich das herausfinden kann? Danke Pistolpete Zitieren
Klotzkopp Geschrieben 8. April 2002 Geschrieben 8. April 2002 Original geschrieben von Pistol2408 Allerdings bekomme ich noch immer die Fehlermeldung "Debug assertion failed" Welche Assertion ist es denn? Datei und Zeilennummer würden schon helfen. Weißt du vielleicht, welche Parameter "void CAdodc::SetConnectionString()" und "void CAdodc::SetRecordSource()" übergeben werden müssen, oder weißt du einen Weg, wie ich das herausfinden kann? Ich nehme an, das sind die Methoden der generierten ADO-Wrapper-Klasse, die Du geändert hast. Was stand denn vorher drin? Zitieren
Blueeye Geschrieben 8. April 2002 Autor Geschrieben 8. April 2002 Welche Assertion ist es denn? Datei und Zeilennummer würden schon helfen. Der Fehler tritt in der Datei "winocc.cpp" in Zeile345 auf. Zitieren
Klotzkopp Geschrieben 8. April 2002 Geschrieben 8. April 2002 Vergiss, was ich über BSTR erzählt habe Allerdings sieht es so aus, als ob InvokeHelper aufgerufen wird, bevor das Control erstellt wurde (zumindest vor einem AttachControlSite-Aufruf). In welcher Methode rufst Du SetConnectionString auf? Zitieren
Blueeye Geschrieben 8. April 2002 Autor Geschrieben 8. April 2002 Die Methode heißt "BOOL COrac2App::InitInstance()" Ich dachte mir, das ich die Methoden einfach aufrufen kann, bevor das Fenster initialisiert wird. CAdodc ini; ini.GetConnectionString(); ni.SetRecordSource(); ni.SetConnectionString(); COrac2Dlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); if (nResponse == IDOK) Zitieren
Klotzkopp Geschrieben 8. April 2002 Geschrieben 8. April 2002 Ich denke, Dein Steuerelement sollte besser Member Deiner Dialogklasse sein. Die Aufrufe gehören dann in COrac2Dlg::OnInitDialog(). Zitieren
Crush Geschrieben 8. April 2002 Geschrieben 8. April 2002 Wegen der Frage oben: Vielleicht bringt das was setConnectionString("DSN=data source name;DATABASE=database;UID=user id;PWD=password"); Es muß also vorher schon die Datasource definiert worden sein. Der Datenbankname und Paßwort liegen auf dem Datenbank-Server. Der Connectionstring kann auch bei Open() angegeben werden! Bei SetRecordSource() wird der Tabellenname angegeben und ein SQL-Select dazu. MyRecord.setRecordSource("DRIVER=SQL Server;SERVER=Servername;User ID=PersonalID;PASSWORD=MyPassword;DATABASE=Kundenanschrift", "Select * from Kunden"); Vermutlich muß man halt bei CAdoDC:: dasselbe übergeben. Aufrufe ohne Parameter führen garantiert zum Assert. Ein BString hat die Länge am Anfang stehen. Versuche Dir mal ohne irgendwelche Funktionen, bei denen man sich auch nicht ganz sicher sein kann den BString selbst zusammen zu basteln. Anfangs die Länge (vermutlich unsigned short int) und dann der String. Ein 0-Byte wird als Endung nicht benötigt, weil die Länge den String eingrenzt. Vielleicht weiß ja Klotzkopp, wie der BString genau ganz aufgebaut ist ... ist doch hoffentlich der von BCPL... Zitieren
Blueeye Geschrieben 8. April 2002 Autor Geschrieben 8. April 2002 Wenn ich die Methoden in "COrac2Dlg::OnInitDialog()" bekomme ich folgenden Fehler angezeigt: Datenquellenname nicht gefunden und kein Standardtreiber angegeben. Also wird das Steuerelement schon vorher abgefragt. Den Fehler mit der "winocc.cpp" bekomme ich dann immer noch. Welche Klassen werden den vor "::OnInitDialog()" noch gestartet? Zitieren
Blueeye Geschrieben 8. April 2002 Autor Geschrieben 8. April 2002 Bezüglich der Antwort von Crush Wenn ich den ConnectionString aber mit dem Assistenten des Steuerelements konfiguriere hat der Connection String folgende Syntax: Provider=MSDAORA.1;Password = pass; User ID = user; Data Source= host; Persist Security Info=True Zitieren
Klotzkopp Geschrieben 8. April 2002 Geschrieben 8. April 2002 Wo hast Du denn die Info bezüglich der manuellen Ansteuerung her? Ich hab das grad mal probiert, und ich kann die Einstellungen im Resource-Editor nicht ändern. Die Methoden der Wrapper-Klasse werden jedenfalls vom Framework nicht aufgerufen. Zitieren
Crush Geschrieben 8. April 2002 Geschrieben 8. April 2002 Geh mal in den ODBC-Datenquellen-Administrator rein und schau Dir mal Deine Datenquelle genau an. Vielleicht ist das Password oder der Name nicht korrekt geschrieben - oder schon im DBA falsch angegeben. Wenn Du einen normalen SQL-Client öffnest, bekommst Du da auch wirklich einen Connect und kannst einen Describe oder einen Select auf die Tabellen machen? Schalt doch mal den Visual Studio Analyzer ein (odbctrac.dll auswählen). Check doch mal die SQL.log durch, vielleicht kann das auch noch einen Hinweis auf mögliche Fehlerquellen geben. Bis zum Assert muß er ja schonmal durchlaufen. Warum mußt Du unbedingt über ActiveX? Gerade Oracle hat ja auch einen prima ODBC-Wrapper, der sich T-Net nennt (hat aber nix mit Telekom zu tun) und fast noch schlichter zu bedienen und vor allem schneller ist (ist nur ein Tip). 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.