MySQL mit C++, Frage zu geschachtelten SELECT



  • Hi. Ich habe folgendes grobes Gebilde

    if (mysql_query(mysql,"SELECT 1")==0)
    {
    	MYSQL_RES *res = mysql_use_result(mysql);
    	if (res)
    	{
    		MYSQL_ROW row = mysql_fetch_row(res);
    		while (row)
    		{
    			if (mysql_query(mysql,"SELECT 2")==0)
    			{
    				mysql_free_result(res_dg);
    			}
    			row = mysql_fetch_row(res);
    		}
    		mysql_free_result(res);
    	}
    }
    

    Mein Problem ist nun, dass "SELECT 2" einen Fehler liefert. Wenn ich
    int result = mysql_query(mysql,"SELECT 2");
    schreibe, dann sagt mir result = 1 (CR_COMMANDS_OUT_OF_SYNC)

    Kennt sich jemand mit dieser Thematik aus und kann mich auf meinen Fehler aufmerksam machen? 🙂
    Benötige ich für die zweite SELECT ein anderes mysql-Objekt, sprich eine zweite Datenbankverbindung?



  • Mal eine andere Frage: Warum ein SELECT2 auf eine ROWLISTE?

    Ds geht doch sicher auch mit JOIN.



  • ich würde ein Storeprocedure nehmen, und den code net in der Anwendung selber implementieren.



  • Schade, dass hier nur Antworten kommen, wie man das Problem umgeht. Ich kenne leider auch nicht die Lösung und kann nur sagen, dass ich mal auf das gleiche Problem gestossen bin. In einem Mysql-Forum hatte ich auch mal nach einer Lösung gefragt, aber leider ohne Erfolg.

    Ich habe eine Bibliothek geschrieben, welches den Datenzugriff auf verschiedene Datenbanken abstrahiert (tntdb). Da ist das gleiche Problem im Mysql-Treiber aufgetreten. Wäre echt Klasse, wenn es dazu eine Lösung gäbe.

    Wenn ich während ich durch einen Cursor iteriere keine weiteren SQL-Statements aufführen kann, wäre das ein grosser Nachteil von Mysql. Momentan meide ich Mysql unter anderem aus diesem Grund.

    Übrigens: mein Vorschlag, wie Du das Problem umgehen kannst ist, postgresql zu verwenden 😉 . So umgehe zumindest ich das.



  • mysql_use_result lädt das Result nicht auf den Client.
    Wenn DU das möchtest dann nimm mysql_store_result. Ist auch besser da der Mysql freigegeben wird und somit INSERT/UPDATES/DELETES drankommen.



  • Ich nutze auch lieber Postgresql 🙂



  • Ich kann zu dem Thema leider keine Lösung anbieten.

    Ich weiss nur, dass es das selbe Problem bei MSSQL auch gibt, bzw. gab.
    Bei MSSQL wurde irgendwann (welche Version weiss ich nimmer auswendig) das "MARS" (multiple active result sets) Feature eingeführt, welches genau das erlaubt was du da machst: mehrere Result-Sets/Cursor gleichzeitig offen zu haben, mit nur einer DB-Verbindung.

    Daher könnte ich mir gut vorstellen, dass es bei MySQL eine ähnliche Einschränkung gibt, wie bei MSSQL ohne aktiviertem "MARS".



  • Unix-Tom schrieb:

    mysql_use_result lädt das Result nicht auf den Client.
    Wenn DU das möchtest dann nimm mysql_store_result. Ist auch besser da der Mysql freigegeben wird und somit INSERT/UPDATES/DELETES drankommen.

    Kann ich danach dann auch andere SQL-Statements ausführen?

    Auf der anderen Seite führt das Feature die Idee von Cursors (oder Cursoren - was ist denn das Genitiv Plural von Cursor? 😕 ) ad absurdum. In der Regel verwende ich Cursor, wenn die zu lesende Datenmenge so groß ist, dass ich sie nicht als ganzes im Speicher halten möchte.

    Häufig habe ich den Anwendungsfall, dass ich aus einer grossen Datenbank Daten lese und satzweise verarbeite. Bei der satzweisen Verarbeitung möchte ich hin und wieder mal auf die Datenbank zugreifen. Das geht dann offensichtlich nicht.



  • Unix-Tom schrieb:

    mysql_use_result lädt das Result nicht auf den Client.
    Wenn DU das möchtest dann nimm mysql_store_result. Ist auch besser da der Mysql freigegeben wird und somit INSERT/UPDATES/DELETES drankommen.

    Du meinst es müsste dann so aus schauen?

    if (mysql_query(mysql,"SELECT 1")==0)
    {
        MYSQL_RES *res = mysql_store_result(mysql);
        if (res)
        {
            MYSQL_ROW row = mysql_fetch_row(res);
            while (row)
            {
                if (mysql_query(mysql,"SELECT 2")==0)
                {
    				MYSQL_RES *res_2 = mysql_store_result(mysql);
    				if (res_2)
    				{
    					MYSQL_ROW row_2 = mysql_fetch_row(res_2);
    					while (row_2)
    					{
    						row_2 = mysql_fetch_row(res_2);
    					}
    				}
    				mysql_free_result(res_2);
                }
                row = mysql_fetch_row(res);
            }
            mysql_free_result(res);
        }
    }
    

    Wenn ich dies so ausführe, dann hängt er sich in der while(row_2) auf, sprich die Schleife wird ewig durchlaufen und ich muss den Task beenden. Eventuell eine Idee warum?



  • Das Result auf den Server loslassen ist nie eine gute Idee. Da sollte man dann schon den Client nutzen.
    Der Server soll Daten liefern und nicht verarbeiten.
    USE wurde für bestimmte Zwecke eingeführt die sich mir noch nie erschlossen haben.
    Wenn Du alle Daten aus der DB haben willst dann kannst Du auch diese auch selektiv abfragen. z.B. Nach AutoID.



  • Das obige Beispiel ist mit mysql_store_result und nicht mysql_use_result. Falls es das war auf das du hinweisen wolltest, denn ich verstehe bei deinem letzten Text leider nur "Bahnhof". War dieser überhaupt auf meinen letzten Kommentar? ^^



  • Danke für die Hilfe. Problem hat sich erledigt, war lediglich eine falsche Variable im Original Quelltext. 🙂


Anmelden zum Antworten