Datenbankzugriff korrekt beenden
-
Hallo!
Ich habe ein Problem mit einem Datenbankzugriff innerhalb einer Komponente (dll).
Ich öffne innerhalb einer Komponente einen Datenbankzugriff schließe diesen dann in der Komponente wieder. Wenn die Komponente nun beendet wird und daraufhin das Programm geschlossen, welches die Komponente gestartet hat, erhalte ich drei aufeinanderfolgende Fehlermeldungen. Und zwar dass die Anwendung aufgrund eines ungültigen Vorgangs geschlossen wird.
Wenn ich den Datenbankzugriff nicht ansteuern lasse in der Komponente, kann das Programm ganz normal beendet werden und es erscheinen keine Fehlermeldungen.
Bei dem Zugriff wird die Datenbank ganz normal geöffnet und geschlossen (bei einem vergleichbaren Programm habe ich einen vergleichbaren Code verwendet und dort funktionierte es) Doch irgendwie scheint die Datenbank ja nicht ganz richtig geschlossen worden zu sein.
Wer kann helfen? Bin für jede Vorschläge offen!
mfg
N.Rico
-
Welche Datenbank. Code ?
-
Hallo nochmal!
Es ist eine COM-Komponente, die ich mit dem MFC-Anwendungassisten erstellt habe.
Der Datenbankzugriff erfolgt in einem eigenen Dialog in dieser Komponente. Wenn ich den Datenbankzugriff nicht aufrufen lasse, dann kann ich die Komponente ganz normal schließen und das Programm, welche diese aufgerufen hat, auch.
Sobald der Datenbankzugriff erfolgt, kann ich das Programm nicht sauber beenden, es folgen drei Fehlermeldungen:
Das Programm verursachte einen Fehler durch eine ungültige Seite in Modul KERNEL32.DLL bei 0167:bff7b9a6.
Sobald ich jedoch die drei Close-Befehle nicht aufrufe, erscheint nur eine einzige dieser Fehlermeldungen.Also, dies ist der Code, mit dem ich den Datenbankzugriff durchführe.
// Die Struktur nimmt die einzelnen Datenbankfelder auf
struct MYBIND
{
MYBIND()
{
memset(this, 0, sizeof(*this));
}TCHAR szValue[250];
DWORD dwStatus;
};// Die Initialisierungen für den Datenbankzugriff
DBCOLUMNINFO* pColumnInfo = NULL;
struct MYBIND* riskBind;
CCommand<CManualAccessor> risk;
CSession risk_session;
CDataSource riskdatenbank;
CString sqlstat;//--------------------------------------------------------------------------------
// hier wird der Datenbankzugriff "hochgefahren"CString pfad2;
char buf2[1024];
::GetCurrentDirectory(255, buf2);
pfad2 = buf2;CString source = "DSN=Visual FoxPro Tables;UID=;PWD=;SourceDB=";
source += pfad2;
source += ";SourceType=DBF;Exclusive=Nein;BackgroundFetch=Ja;Collate=Machine;";CDBPropSet dbinit(DBPROPSET_DBINIT);
CDBPropSet propset(DBPROPSET_ROWSET);dbinit.AddProperty(DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO, false);
dbinit.AddProperty(DBPROP_INIT_PROMPT, (short)4);
dbinit.AddProperty(DBPROP_INIT_PROVIDERSTRING, source);
dbinit.AddProperty(DBPROP_INIT_LCID, (long)1031);riskdatenbank.OpenWithServiceComponents("MSDASQL.1", &dbinit);
risk_session.Open(riskdatenbank);
propset.AddProperty(DBPROP_IRowsetChange, true);
propset.AddProperty(DBPROP_UPDATABILITY,
DBPROPVAL_UP_INSERT | DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_DELETE);//--------------------------------------------------------------------------------
sqlstat = "SELECT * FROM ik_risik"
//--------------------------------------------------------------------------------
// hier der eigentliche Datenbankzugriffif (risk.Open(risk_session, sqlstat, &propset, NULL, DBGUID_DBSQL, FALSE) != S_OK)
{
MessageBox("Datensatz konnte nicht geladen werden.", "Warnung", MB_OK);
}
else
{
}//--------------------------------------------------------------------------------
// hier nur noch die Übergabe (an diesem liegt es nicht, da ich die schon
// weggelassen habe, der Fehler blieb derselbeif (risk.m_spRowset != NULL)
{
ULONG ulColumns = 0;
DBCOLUMNINFO* pColumnInfo = NULL;
LPOLESTR pStrings = NULL;risk.GetColumnInfo(&ulColumns, &pColumnInfo, &pStrings);
riskBind = new MYBIND[ulColumns];
risk.CreateAccessor(ulColumns, &riskBind[0],
sizeof(MYBIND)*ulColumns);for (ULONG l=0; l<ulColumns;l++)
risk.AddBindEntry(l+1, DBTYPE_STR, sizeof(TCHAR)*200, \
&riskBind[l].szValue, NULL, &riskBind[l].dwStatus);risk.Bind();
int nItem = 0;
ULONG ulFields = risk.GetColumnCount();risk.MoveFirst();
}//--------------------------------------------------------------------------------
// hier wird die Datenbank wieder geschlossenrisk.Close();
riskdatenbank.Close();
risk_session.Close();
//--------------------------------------------------------------------------------mfg N.Rico
-
...vielleicht ist es ein Problem der COM-Komponente selbst. Habe durch einfügen von Messaheboxes gesehen, dass die Fehlermeldungen unmittelbar erscheinen, sobald die Komponente nach Beenden des Clients die Funktion DllCanUnloadNow() aufruft.
Wenn ich den Datenbankzugriff nicht schließe, bevor ich die Komponente schließe, erscheint die Fehlermeldung nur ein einziges statt dreimal!
Weiß irgendjemand Rat und könnte helfen?
mfg N.Rico