002
28.07.2004, 13:37 Uhr
~N.Rico
Gast
|
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 Datenbankzugriff
if (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 derselbe
if (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 geschlossen
risk.Close(); riskdatenbank.Close(); risk_session.Close(); //--------------------------------------------------------------------------------
mfg N.Rico |