Seite 1 von 1
Zusammengesetzte SQL-Queries
Verfasst: 24. Januar 2013 11:31
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)
Re: Zusammengesetzte SQL-Queries
Verfasst: 24. Januar 2013 11:34
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.
Re: Zusammengesetzte SQL-Queries
Verfasst: 24. Januar 2013 11:49
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
Re: Zusammengesetzte SQL-Queries
Verfasst: 24. Januar 2013 12:35
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
Re: Zusammengesetzte SQL-Queries
Verfasst: 24. Januar 2013 12:39
von dazedly
Beispielcode?
Re: Zusammengesetzte SQL-Queries
Verfasst: 24. Januar 2013 16:42
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)