Qt TableModel für SP verwenden
-
Gibt es einen Trick wo man ein TableModel
für Stored Procedures verwenden kann?ODBC SQL 2008
Laut Doku geht das nur mit SqlQuery .
Die SP gibt eine SELECT Anweisung zurück die in ein View Soll.
-
nutz doch einfach die SP im SqlQuery.
-
Naja der Rückgabewert der SP soll ja in einer View dargestellt werden.
Der Weg zu Fuß da ein Table Widget "zu Füttern" ist nicht so chick wie ein Table View zu verwenden.
-
Zabou schrieb:
Naja der Rückgabewert der SP soll ja in einer View dargestellt werden.
Der Weg zu Fuß da ein Table Widget "zu Füttern" ist nicht so chick wie ein Table View zu verwenden.
Wo ziehst du diese Aussage her?!?
QSqlQueryModel und ab damit in ein QTableView.
-
QSqlQueryModel unterstützt kein prepare & addBindValue um Parameter zu übergeben.
Ein Integer als Value kann man noch bei Aufruf mit übergeben , bei Strings als Value klappt das nicht.
-
Zabou schrieb:
QSqlQueryModel unterstützt kein prepare & addBindValue um Parameter zu übergeben.
Ein Integer als Value kann man noch bei Aufruf mit übergeben , bei Strings als Value klappt das nicht.Guck Doku!
QSqlQueryModel übergibst du mit setQuery() ein QSqlQuery. QSqlQuery wiederum bietet prepare/addBindValue.
-
Das Funktioniert nicht wirklich,
QSqlQuery setzt bei SP laut Doku setForwardOnly(true) voraus.
DasQSqlTableModel setzt wiederum voraus das das Query kein setForwardOnly(true) hat.Scheint auch in der Praxis so nicht zu funktionieren versuche:
tokenmodel = new QSqlQueryModel(this); ui->viewsuchetokens->setModel(tokenmodel); tokenmodel->sort(1,Qt::AscendingOrder); QSqlQuery query; query.prepare("{CALL QLPWD.sp_get_token_bereich VALUES (?)}"); query.addBindValue("gfdfgd"); query.exec(); //auch ohne voheriges exec() probiert bei allen anderen Beispielen tokenmodel->setQuery(query); qDebug()<< tokenmodel->lastError()<<tokenmodel->rowCount();
query.prepare("{CALL QLPWD.sp_get_token_bereich VALUES (?)}"); query.bindValue(0,"gfdfgd");
Einzig zu funktionieren scheint EXECUTE
tokenmodel->setQuery("EXECUTE QLPWD.sp_test '1'");
Warum auch immer sich eine SP unter ODBC mit EXECUTE aufrufen läßt, so funktioniert es nur mit integer nicht mit Strings.
Mit QSqlQuery funktioniert aber EXECUTE nicht ^^
-
So gelöst, falls jemand das gleiche Prob hat:
Funktioniert nur mit
addBindValue(Value,QSql::IN); // IN OUT wichtig;
Wichtig ist das Schema und SP Name in [].[] gesetzt werden, soll vor das Schema die db , muß die auch in [], also :
[db].[Schema].[sp_name] query.prepare("{?=CALL [QLPWD].[sp_set_dokument_bereich](?,?)}");//hier Schema.Name
die Parameter für in und Out müssen in der richtigen reihenfolge sein.
Das ? vor CALL ist der Statußcode.
Benötigt mann einen Rückgabewert einer Berechnung muß
das query aufquery.setForwardOnly(true);
gesetzt werden.
dann läst es sich nicht an ein TableQueryModel binden !!
Ist ein Return Code vergeben muß das ?= vor Call und ein OUT Wert Definiert sein.
-
.bindValue(Position,Value,In/Out);
geht nicht
-
Nochmal Exampel;
QSqlQuery query; query.prepare("{?=CALL [QLPWD].[sp_set_dokument_bereich](?,?)}"); query.addBindValue(0,QSql::Out); query.addBindValue(this->dokument,QSql::In); query.addBindValue(Value,QSql::In); query.exec(); qDebug()<<query.boundValues();
Solch ein Query läst sich als Query an QSqlQueryModel vergeben
querymodel.setQuery(query);
sind hinngegen Outparameter verwendet in den (values), muß
query.setForwardOnly(true);
sonst gehen out parameter nicht abzufragen.
und es geht nicht als query für ein QueryModel .