CListView Fenster und Behandlung der Einträge



  • char str; // hier definierst Du Platz für ein(!) Zeichen, nicht für einen String.
    str = db.execDML("select * from owl"); // das muss daher schief gehen
    hRoot = ctlLeagues.InsertItem(str); // hier erwartet man bei einem Parameter einen Zeiger auf eine Struktur (siehe Fehlermeldung) oder auf einen char-String.
    

    😉 ... so läuft das nicht. Du hast keine ausreichenden Kenntnisse bezüglich C/WinAPI und hantierst mit komplexen Controls. Viel Spaß weiterhin. 😃

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_mfc_ctreectrl.3a3a.insertitem.asp
    Du findest an dieser Stelle in der MSDN ein konkretes Codebeispiel.



  • Ich versteh jetzt nicht, was das mit der Fehlermeldung zu tun hat?



  • Schau dir mal das beispiel vom Wrapper an. Hier wirst du dann feststellen, dass du dein Statment zum einen mit der falschen Funktion aufrufst und zum anderen die Daten falsch auslist.
    Beispiel von der codeproject Seite

    ///////////////////////////////////////////////////////////////////
         // Query data and also show results of inserts into auto-increment field
         //////////////////////////////////////////////////////////////////
            cout << endl << "Select statement test" << endl;
            CppSQLiteQuery q = db.execQuery("select * from emp order by 1;");
    
            for (fld = 0; fld < q.numFields(); fld++)
            {
                cout << q.fieldName(fld) << "(" << q.fieldType(fld) << ")|";
            }
            cout << endl;
    
            while (!q.eof())
            {
                cout << q.fieldValue(0) << "|";
                cout << q.fieldValue(1) << "|" << endl;
                q.nextRow();
            }
    


  • Ich versuche mal zu erklären.
    Vor ein paar Jahren hatte ich schon mal angefangen mit C/C++ und hatte mir da dann stolze 5 Bücher zu gelegt. Manche von diesen Büchern kann man getrost vergessen, aber sowas weiß man vorher ja nie. Da ich aber immer probleme hatte mal aus dem was einem in den Büchern gelernt wurde, auch mal eigene Projekte zu starten und somit eigenen Code zu erstellen (Was meistens in einem totalen chaos endete) und ich feststellte, das ich eigentlich noch rein garnichts kapierte, hat mich der Mut verlassen.

    Zwischenzeitlich habe ich aber dann PHP gelernt, wo ich auch guten Code schreiben kann.

    Da ich aber immer noch ein Programm im Kopf habe, das ich zu Papier bringen will, hat mich der Ergeiz nun doch wieder gepackt.

    Daher hab ich nun wieder angefangen mit VC++.



  • Okay ihr beiden,

    ich habs jetzt gelöst. Hier mein jetziger Code

    // Datenbank einbinden
    	const char* gszFile = "F:\\Visual Studio 2005\\Projects\\Favoriten\\debug\\favoriten.db";
    	CppSQLite3DB db;
        db.open(gszFile);
    	if(!db.tableExists("emp"))
    	{
    		db.execDML("create table emp(empno int, empname char(20));");
    		db.execDML("insert into emp values (1, 'World Football Championships2');");
    	} 
    
    	HTREEITEM hRoot;
    	HTREEITEM hSeason;
    
    	CppSQLite3Query q = db.execQuery("select * from emp order by 1;");
    
        hRoot = ctlLeagues.InsertItem(q.fieldValue(1), 0, 1);
    

    Grüße Stipo



  • Bravo!

    HTREEITEM hRoot, hSeason;
    

    ist einfacher.
    char(20) ist das so mit runden Klammern o.k.?



  • Schönen Sonntag,

    jetzt hab ich so ne nette Fehlermeldung die ich nicht kapiere und auch nicht weg bekomme:

    nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) ist bereits in LIBCMTD.lib(dbgdel.obj) definiert.
    F:\Visual Studio 2005\Projects\Favoriten\Debug\Favoriten.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.

    Wie kann ich die beheben? Was will mir der Compiler damit sagen?

    Grüße Stipo





  • So da bin ich wieder 🙂

    // Datenbank einbinden
    	const char* gszFile = "F:\\Visual Studio 2005\\Favoriten\\debug\\favoriten.db";
    	CppSQLite3DB db;
        db.open(gszFile);
    	// Tabelle Testweise mit Daten füllen
    	if(!db.tableExists("tree"))
    	{
    		db.execDML("create table tree(id int, parent_id int, user char(150));");
    		db.execDML("insert into tree values (1, 0, 'Haupt 1');");
    		db.execDML("insert into tree values (2, 0, 'Haupt 2');");
    		db.execDML("insert into tree values (3, 1, 'Unter 1');");
    		db.execDML("insert into tree values (4, 1, 'Unter 2');");
    		db.execDML("insert into tree values (5, 3, 'Item 1');");
    		db.execDML("insert into tree values (6, 3, 'Item 2');");
    	} 
    
    	CppSQLite3Query q = db.execQuery("select * from tree where parent_id=0;");
    	while (!q.eof())
        {
    		HTREEITEM hRoot, hSeason;
    		hRoot = LeftTree.InsertItem(q.fieldValue(2), 0, 1);
    		CppSQLite3Query q1 = db.execQuery("select * from tree where parent_id=1;");
    		while (!q1.eof())
    		{
    			hSeason = LeftTree.InsertItem(q1.fieldValue(2), 2, 3, hRoot);
    			CppSQLite3Query q2 = db.execQuery("select * from tree where parent_id=3;");
    			while (!q2.eof())
    			{
    				LeftTree.InsertItem(q2.fieldValue(2), 4, 5, hSeason);
    				q2.nextRow();
    			}
    			q1.nextRow();
    		}
    		q.nextRow();
        }
    

    Den Quellcode hab ich jetzt mal erstellt und die Daten des Tree dynamisch aus der Datenbank generieren zu können.
    Soweit funktioniert das ganze auch wie es soll.
    Nun zu meiner Frage:
    Wie kann ich bei den SQL Abfragen im C++ einen Wert einer voherigen abfrage zufügen?

    Bsp:

    hRoot = LeftTree.InsertItem(q.fieldValue(2), 0, 1);
    CppSQLite3Query q1 = db.execQuery("select * from tree where parent_id="q.fieldValue(0)";");

    Denn so kann ich das beim PHP machen. Hab nur keine Ahnung wie das im C++ geht.

    Grüße Stipo



  • Schau dir mal die Klasse CppSQLiteBuffer an. Ebenfalls findest du ein Beispiel davon in den Beispieldaten 😉

    CppSQLiteBuffer bufSQL;
    


  • Danke so funktioniert es.

    Hier mein Code dazu:

    CppSQLite3Query q = db.execQuery("select * from tree where parent_id=0;");
    	while (!q.eof())
        {
    		HTREEITEM hRoot, hSeason;
    		hRoot = LeftTree.InsertItem(q.fieldValue(2), 0, 1);
    		CppSQLite3Buffer bufSQL;
    		bufSQL.format("select * from tree where parent_id=(%Q);", q.fieldValue(0));
    		CppSQLite3Query q1 = db.execQuery(bufSQL);
    		while (!q1.eof())
    		{
    			hSeason = LeftTree.InsertItem(q1.fieldValue(2), 2, 3, hRoot);
    			CppSQLite3Buffer bufSQL;
    			bufSQL.format("select * from tree where parent_id=(%Q);", q1.fieldValue(0));
    			CppSQLite3Query q2 = db.execQuery(bufSQL);
    			while (!q2.eof())
    			{
    				LeftTree.InsertItem(q2.fieldValue(2), 4, 5, hSeason);
    				q2.nextRow();
    			}
    			q1.nextRow();
    		}
    		q.nextRow();
        }
    

    Gruß Stipo


Anmelden zum Antworten