odbc / sql2008 / qt Rückgabewerte stimmen nicht
-
Hu Hu ,
hab das kleine Problem das ich als Rückgabe von @@identiy null bekomme im Programm, nicht aber im SQLManagement Studio.
Gleiches bei transact anweisungen die eigentich ein Rollback erfordert hätten bekomme ich true zurück.Normales insert und Query klappt, bei allen anderen Dingen kommt eigentlich null zurück.
Nur weiß ich nicht wo ich den Fehler suchen muss, einstellungen im SQL, am ODBC oder besondere Parameter übergeben.
Habs mit DSN, native client , native client 10.0 und SQL Server probiert.
QT liefert ja einen ODBC Treiber mit , macht das eher Sinn den MS ODBC zu nutzen , geht das überhaupt ?
Hat einer Qt mit SQL Server 2008 am laufen über ODBC ?
-
Was willst Du mit @@identiy erreichen.
@@identiy gibt die ID eines Autoincrement zurück.Wenn dann müsstest Du @@error abfragen
-
Hi Unix-Tom,
autoinkrement brauche um den fk in der zweiten Tabelle einzutragen.
Das mit Error ist natürlich bei Transact richtig, in jedem Fall bekomme ich null zurück, auch wenn ( absichtlicher Fehler zum Test ) transact fehlerhaft war.QSqlQuery query; // query.setForwardOnly(true); query.prepare("INSERT INTO QLPWD.main (name,typ_id,kurz) VALUES (?,?,?)"); query.bindValue(0,ui->lineneu->text()); query.bindValue(1,1); query.bindValue(2,ui->textvor->toPlainText()); query.exec(); bool check = db->commit(); transac(&check,&query); QVariant index = query.exec("SELECT @@IDENTITY"); qDebug() << index; query.finish(); query.prepare("INSERT INTO QLPWD.inhalt (main_id,cont) VALUES (?,?)"); query.bindValue(0,index); query.bindValue(1,ui->text->toPlainText()); query.exec(); check = db->commit(); transac(&check,&query); query.prepare("INSERT INTO QLPWD.sort (token_id,main_id) VALUES (?,?)" ); for(std::map<int,QString>::iterator iter=zuset->begin();iter != zuset->end();iter++){ query.bindValue(0,iter->first); query.bindValue(1,index); } query.exec(); check = db->commit(); transac(&check,&query); }
Irgendwie bekomme ich ,bei allen auch anderen abfragen, nur null zurück, in dem Beispiel müßte die db eigentlich ein Rollback machen da ich schon beim zweiten ein fk Verletzung habe. Statdessen bekomme ich die alles io Meldung.
-
query.exec("SELECT @@IDENTITY as 'id'"); QSqlRecord rc =query.record(); QVariant index = rc.value("id").toULongLong(); qDebug() << index << "---" <<query.lastInsertId();
Nochmal umgebaut, aber :
QVariant(qulonglong, 0) --- QVariant(, )
QODBCResult::exec: Unable to execute statement: " [Microsoft][SQL Server Native Client 10.0][SQL Server]Die INSERT-Anweisung steht in Konflikt mit der FOREIGN KEY-Einschränkung 'FK_inhalt_main'. Der Konflikt trat in der 'LPWD'-Datenbank, Tabelle 'QLPWD.main', column 'main_id' auf."
-
Schreib Proceduren in der Datenbank um Daten einzufügen. Als Out-Parameter die NeueID. Nach dem Ausführen sollte dann die neue ID zur Verfügung stehen.
http://doc.trolltech.com/4.6/qsqlquery.html schrieb:
Binding values to a stored procedure:
This code calls a stored procedure called AsciiToInt(), passing it a character through its in parameter, and taking its result in the out parameter.
QSqlQuery query; query.prepare("CALL AsciiToInt(?, ?)"); query.bindValue(0, "A"); query.bindValue(1, 0, QSql::Out); query.exec(); int i = query.boundValue(1).toInt(); // i is 65
-
Danke für eure Mühe .
Habs gefunden
q2.exec("SELECT @@IDENTITY as 'id'"); q2.first(); QVariant index = q2.value(0); q2.finish();
So funktionierts ^^.
Das mit dem Rollback funktioniert noch nicht.