Zusammengesetzte SQL-Queries

Alles rund um die Programmierung mit Qt
Antworten
Tilman Räger
Beiträge: 189
Registriert: 6. Juni 2007 15:23
Wohnort: Göttingen

Zusammengesetzte SQL-Queries

Beitrag von Tilman Räger »

Hallo,

Unterstützen die Qt-SQLKlassen (also in erster Linie QSqlQuery) die Verarbeitung von zusammengesetzten SQL-Statements der Form:

Insert into Tabelle (Spalte1, Spalte2) values (Val1, Val2) ; Select * From Tabelle

Falls ja, wie muss ich ein solches Statement aufbereiten? Die oben genannte Variante gibt mir lediglich das Resultat des 1. Teils zurück, der Select-Befehl wird anscheinend nicht mehr ausgeführt.


Gruss
Tilman (Räger)
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Re: Zusammengesetzte SQL-Queries

Beitrag von BartSimpson »

Ich würde sowas wenn möglich als Prozedur in der Datenbank ablegen und denn das ganze mit
"call name()" und den Werten aufrufen.
Tilman Räger
Beiträge: 189
Registriert: 6. Juni 2007 15:23
Wohnort: Göttingen

Re: Zusammengesetzte SQL-Queries

Beitrag von Tilman Räger »

Hallo,
BartSimpson hat geschrieben:Ich würde sowas wenn möglich als Prozedur in der Datenbank ablegen und denn das ganze mit
"call name()" und den Werten aufrufen.
Ich denke nicht, das mein Auftraggeber das akzeptieren würde. Die Alternative wäre für mich lediglich, das Statement am Semikolon aufzusplitten und sequentiell auszuführen (was ich mir allerdings gerne sparen würde)

Tilman
Tilman Räger
Beiträge: 189
Registriert: 6. Juni 2007 15:23
Wohnort: Göttingen

Re: Zusammengesetzte SQL-Queries

Beitrag von Tilman Räger »

Hallo,

noch eine Ergänzung. Meine Tests haben jetzt ergeben, das offensichtlich beide Teile der Query ausgeführt werden, ich jedoch lediglich das Ergebnis des 1. Teils erhalte. Mache ich da was falsch?
Ich frage den Rückgabewert der Query ab und hole, wenn true, das Ergebnis ab.

Gruss
Tilman
dazedly
Beiträge: 197
Registriert: 3. Oktober 2010 15:38
Kontaktdaten:

Re: Zusammengesetzte SQL-Queries

Beitrag von dazedly »

Beispielcode?
Tilman Räger
Beiträge: 189
Registriert: 6. Juni 2007 15:23
Wohnort: Göttingen

Re: Zusammengesetzte SQL-Queries

Beitrag von Tilman Räger »

Hallo,
dazedly hat geschrieben:Beispielcode?
ich kann hier nicht so ohne weiteres den Code meiner Anwendung publizieren (was auch nichts bringen würde) aber kurz die Methode, wie ich die Query auswerte (stark gekürzt):

Code: Alles auswählen

        Response.setSQLRequest(Request.SQLRequest());
        if (m_pQuery->exec(Request.SQLRequest()))        {
            Response.setResult(SQL4automation::R_SUCCESS);
            Response.setRows(m_pQuery->size());
            Response.setColumns(m_pQuery->record().count());

            if (m_pQuery->isSelect())         {
                if (   (Response.rows() <= Request.maxRows()) && (Response.columns() <= Request.maxColumns()))     {
                    for (int i=0; i < m_pQuery->record().count(); i++)   {
                          Response.addFieldName(m_pQuery->record().fieldName(i));
                    }
                    int                     CurrRow = 0;
                    if (m_pQuery->first())   {
                        do  {  // while (!bStringLengthError && m_pQuery->next())
                            for (int i = 0; i < m_pQuery->record().count(); i++)                                            {
                                Response.addValue(m_pQuery->value(i).toString());
                            } // for (...)
                        } while (!bStringLengthError && m_pQuery->next());
                    } // m_pQuery->first()
                } // if ((Rows <= maxRows) && (Cols <= maxColumns))
            }
            m_pQuery->finish();
        } // m_pQuery->exec()
Die Werte maxRows und maxColumns sind Variablen um die Antwort zu begrenzen. Werden mehr Zeilen oder Spalten erhalten, meldet die Anwendung einen Fehler.

Wenn ich auf diesem Weg eine Abfrage der Form 'Insert into .... ; Select ...' starte, erhalte ich als Ergebnis die Rückgabe des Insert-Kommandos. Drehe ich die statements um, also
"Select ....; Insert into"
erhalte ich die Antwort der select-Abfrage, die Insert-Anweisung wird jedoch ebenfalls ausgeführt.

Gibt es eine Möglichkeit entweder generell die letzte Antwort der Query zu erhalten oder - besser noch - die Antwort auf alle Teile. Wenn ich eine entsprechende Query direkt von der Shell aus an MySQL schicke, erhalte ich ja auch
beide Antworten.

Gruss
Tilman (Räger)
Antworten