Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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

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?

Welche Assertion ist es denn? Datei und Zeilennummer würden schon helfen.

Der Fehler tritt in der Datei "winocc.cpp" in Zeile345 auf.

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)

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

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?

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

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.