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 Funktionsaufruf

    db.FillMasterListView(p,"");
    

    wird die Datenbank Master.sdb geöffnet und die Liste gefüllt und auch wieder geschlossen.
    Klasse CSteuerung

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


  • Mod

    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


  • Mod

    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.


Log in to reply