Datei löschen
-
Hallo
Hab eine SDI Anwendung mit SQLITE anbindung geschrieben.
Da wird eine Master.sdb eingelesen und nachdem der Inhalt in einer liste eingetragen wurde sollte die Master.sdb wieder geschlossen und freigegeben werden.
Jetzt will ich die Master.sdb löschen geht aber nicht weil ein Prozess ich bin der Meinung meine SDI Anwendung diese verwendet.in ...view.cpp
void ...View::OnInitialUpdate() { CFormView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); CListView *p = (CListView *) GetDlgItem(IDC_LIST1); CListCtrl *pListview = (CListCtrl *)p; CSteuerung db; // Spalten anlegen pListview->InsertColumn(0,"Beschreibung",LVCFMT_LEFT,250); pListview->InsertColumn(0,"DBName",LVCFMT_LEFT,100); pListview->SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT); // Listview füllen db.FillMasterListView(p,""); }
wird die Liste gefüllt.
wie kann ich den zugriff der SDI Anwendung auf die Master.sdb beenden, erzwingen ... ?
Oder kann mir einer einen Weg aufzeigen wie ich den zugriff finde?
Gruß Califax
PS.
bin ich damit im richtigen Forum?
-
Hallo
Hab nach langem suchen den Schuldigen gefunden.
Mit dem Funktionsaufrufdb.FillMasterListView(p,"");
wird die Datenbank Master.sdb geöffnet und die Liste gefüllt und auch wieder geschlossen.
Klasse CSteuerungvoid CSteuerung::FillMasterListView(CListView *ListView, CString keyword) { // Variable deklarieren; CListCtrl *pListview = (CListCtrl*)ListView; int Index = -1; CString SQLStatment; pListview->DeleteAllItems(); // Überprüfen ob ein Suchstring gesetzt wurde if(!keyword.IsEmpty()) SQLStatment.Format("SELECT * FROM MutterDatenBank WHERE DBName like '%%%s%%' OR Beschreibung like '%%%s%%' ORDER BY LOWER(DBName) DESC, LOWER(Beschreibung) DESC", keyword, keyword); else SQLStatment = "SELECT * FROM MutterDatenBank ORDER BY LOWER(DBName) "; try { // Datenbank öffnen this->db.open(MeinMasterDB_DateiName); // Alle Daten Abrufen this->db_anfrage = this->db.execQuery(SQLStatment); // Alle Datensätze durchgehen while(!this->db_anfrage.eof()) { // Wert in Liste eintragen Index = pListview->InsertItem(0,this->db_anfrage.fieldValue(1)); // Text eintragen pListview->SetItemText(0,1,this->db_anfrage.fieldValue(2)); // ID setzen pListview->SetItemData(Index,this->db_anfrage.getIntField(0)); // Nächsten Datensatz holen this->db_anfrage.nextRow(); } // Datenbank schließen this->db.close(); } catch(CppSQLite3Exception& e) { AfxMessageBox(e.errorMessage()); } }
Aber der Abfrageaufruf hält die Master.sdb noch immer fest.
Also die Abfrageaufruf beenden und alles ist wieder freigegeben.void CSteuerung::FillMasterListView(CListView *ListView, CString keyword) { // Variable deklarieren; CListCtrl *pListview = (CListCtrl*)ListView; int Index = -1; CString SQLStatment; pListview->DeleteAllItems(); // Überprüfen ob ein Suchstring gesetzt wurde if(!keyword.IsEmpty()) SQLStatment.Format("SELECT * FROM MutterDatenBank WHERE DBName like '%%%s%%' OR Beschreibung like '%%%s%%' ORDER BY LOWER(DBName) DESC, LOWER(Beschreibung) DESC", keyword, keyword); else SQLStatment = "SELECT * FROM MutterDatenBank ORDER BY LOWER(DBName) "; try { // Datenbank öffnen this->db.open(MeinMasterDB_DateiName); // Alle Daten Abrufen this->db_anfrage = this->db.execQuery(SQLStatment); // Alle Datensätze durchgehen while(!this->db_anfrage.eof()) { // Wert in Liste eintragen Index = pListview->InsertItem(0,this->db_anfrage.fieldValue(1)); // Text eintragen pListview->SetItemText(0,1,this->db_anfrage.fieldValue(2)); // ID setzen pListview->SetItemData(Index,this->db_anfrage.getIntField(0)); // Nächsten Datensatz holen this->db_anfrage.nextRow(); }
//Datenbank abfrage beenden this->db_anfrage.finalize();
// Datenbank schließen this->db.close(); } catch(CppSQLite3Exception& e) { AfxMessageBox(e.errorMessage()); } }
Gruß Cakifax
-
Indem Du wriklich die Datei schließt...
Dein Code den Du hier zeigst hat damit sicherlich nichts zu tun!
-
Hallo Herr Richter
Ich bin zwar kein Profi wie Sie(ich betreibe nur ein Hobby) aber ich bin anderer Meinung.
Also ich öffne die Dateien über SQLITE und schleiße sie wieder über SQLITE und es geht wie ich mir es vorstelle.
trotzdem danke.Gruß Califax
-
Califax schrieb:
Also ich öffne die Dateien über SQLITE und schleiße sie wieder über SQLITE und es geht wie ich mir es vorstelle.
Die Frage ist was SQL-Lite an dieser Stelle wirklich macht, wenn der Close durchgeführt wird. Wenn es so etwas wie Connection Pooling gibt, dann wird die Verbindng in diesem Moment eben nicht sofort geschlossen.
In jedem Falll ist es etwas was speziell mit SQL-Lite zusammenhängt.
Evtl. mal das ganze db Objekt freigeben...
Nur als Anmerkung: OLE-DB kennt auch Connection Popoling. Der Vorteil. Man öffnet eine Verindung und gibt diese frei, sie wird nicht geschlossen. Erst nach 2 Minuten, wenn niemand diesemehr verwendet, wird diese entdgültig geschlossen. Kommt der Prozess innerhalb der nächsten 2 Minuten auf die Idee und benötigt eine Verbindung wird die aus dem Pool genommen.