Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Datenbankzugriff korrekt schliessen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
27.07.2004, 16:54 Uhr
~N.Rico
Gast


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
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.07.2004, 17:08 Uhr
Bruder Leif
dances with systems
(Operator)


Moin!

So ganz ohne Code wird eine Diagnose ziemlich schwierig... Du schreibst von "Komponenten", meinst Du damit COM, oder arbeitest Du mit einem Borland-Compiler? Und welche drei Meldungen sind das genau?
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
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
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
29.07.2004, 14:13 Uhr
~N.Rico
Gast


...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
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: