Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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!!!!

Geschrieben

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);

Geschrieben

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

Geschrieben
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?

Geschrieben

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?

Geschrieben

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)

Geschrieben

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...

Geschrieben

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?

Geschrieben
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

Geschrieben

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.

Geschrieben

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).

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...