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)
Zusammengesetzte SQL-Queries
-
Tilman Räger
- Beiträge: 189
- Registriert: 6. Juni 2007 15:23
- Wohnort: Göttingen
-
BartSimpson
- Beiträge: 1379
- Registriert: 6. November 2004 12:03
- Kontaktdaten:
Re: Zusammengesetzte SQL-Queries
Ich würde sowas wenn möglich als Prozedur in der Datenbank ablegen und denn das ganze mit
"call name()" und den Werten aufrufen.
"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
Hallo,
Tilman
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)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.
Tilman
-
Tilman Räger
- Beiträge: 189
- Registriert: 6. Juni 2007 15:23
- Wohnort: Göttingen
Re: Zusammengesetzte SQL-Queries
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
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
Beispielcode?
-
Tilman Räger
- Beiträge: 189
- Registriert: 6. Juni 2007 15:23
- Wohnort: Göttingen
Re: Zusammengesetzte SQL-Queries
Hallo,
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)
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):dazedly hat geschrieben:Beispielcode?
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()
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)