Keine Resultate bei Stored Proecdure

Alles rund um die Programmierung mit Qt
Antworten
stefandetter
Beiträge: 7
Registriert: 8. November 2006 14:35
Wohnort: Rosenheim

Keine Resultate bei Stored Proecdure

Beitrag von stefandetter »

Hallo Zusammen,

ich bin ziemlich neu in QT wie auch bei Datenbanken. Ich weiß auch nicht ob ich die Frage hier an der richtigen Stelle frage, aber ich versuche es einfach mal. Vielleicht hat ja jemand Erfahrung damit.

Ich benutze QT 4.2.0 Open Source mit dem MinGW g++ und MS SQL Server 2000 über QODBC.

Ich habe folgendes Problem:
Ich rufe eine Stored Procedure auf, die ein INSERT auf eine Tabelle macht und anschließend den kompletten Datensatz mit einer SELECT Anweisung wieder zurückliefert.
Der Aufruf und das INSERT funktionieren, aber leider bekomme ich keine Resultate von dem SELECT Statemant zurück.

Code Aufbau:

QT

Code: Alles auswählen

  QSqlQuery q(m_db);
  q.prepare("{ CALL Function (?, ?, ?) }");
  q.bindValue( 0, row.Name);
  q.bindValue( 1, row.X);
  q.bindValue( 2, row.Y);
  if(!q.exec()){
    return false;
  }
  while ( q.next() ){ 
    row.Id = q.value( 0); 
  }
  return true;
SQL

Code: Alles auswählen

  CREATE PROCEDURE [dbo].[Function]
  (
    @Name nvarchar (50) = NULL,
    @X int,
    @Y int
  ) AS

  DECLARE @ID int;

  INSERT INTO dbo.Table(Name, X, Y)
  VALUES (@Name, @X, @Y)

  SET @ID=SCOPE_IDENTITY()

  SELECT ID, Name, X, Y
    FROM dbo.Table 
    WHERE ID = @ID

  GO
Lasse ich alles vor dem SELECT weg und frage alle Zeilen ab, bekomme ich alle Zeilen ohne Problem zurück geliefert. Jedoch sobald irgendetwas vor dem SELECT steht, es reicht schon "DECLARE @ID int;", bekomme ich keine Ergebnisse mehr.

SQL

GEHT

Code: Alles auswählen

  CREATE PROCEDURE [dbo].[Function]
  (
    @Name nvarchar (50) = NULL,
    @X int,
    @Y int
  ) AS

  SELECT ID, Name, X, Y
    FROM dbo.Table
  GO
GEHT NICHT MEHR

Code: Alles auswählen

  CREATE PROCEDURE [dbo].[Function]
  (
    @Name nvarchar (50) = NULL,
    @X int,
    @Y int
  ) AS

  DECLARE @ID int;

  SELECT ID, Name, X, Y
    FROM dbo.Table
  GO
Das, was ich dabei nicht verstehe ist, dass wenn ich alle Prozeduren aus dem Query Analyzer des SQL Server ausführen, funktionieren sie wie sie sollen.

Vielleicht kann mir da jemand helfen.

Danke.

Gruß,
Stefan
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Lass dazu mal den Fehler Text vom Treiber und von Qt ausgeben. Dann solltest du relativ schnell wissen, wo dein Problem liegt.
stefandetter
Beiträge: 7
Registriert: 8. November 2006 14:35
Wohnort: Rosenheim

Beitrag von stefandetter »

Habe es gerade versucht, aber es ist, wie ich es mir dachte, q.lastError().text() gibt nichts zurück.

Die Query wird ja auch ausgeführt. Ein Datensatz wird auch in die DB eingefügt, nur das SELECT liefert mir nichts zurück.
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Vielleicht wirst du da zwei Abfragen machen müssen, so clever ist Qt da vielleicht noch nicht. Dann lass doch noch mal ausgeben, was Qt wirklich als Query abfragt. Geht irgendwie mit lastQuery oder sowas.
stefandetter
Beiträge: 7
Registriert: 8. November 2006 14:35
Wohnort: Rosenheim

Beitrag von stefandetter »

Ich glaube ja nicht, dass es an der Query liegt, da die Query welche die Prozedur mit dem reinen SELECT aufruft ja auch funktioniert. Nur sobald ich das DECLARE in der Prozedur verwende, bringt das SELECT keine Ergebnisse mehr.

Hab mir die Query ausgeben lassen:
{ CALL qGC_DefSubstrateLayout_I (?, ?, ?) }

Die Fragezeichnen werden anscheinend auch richtig ersetzt, da INSERT den übergebenen Datensatz in die Tabelle schreibt.

Ich weiß auch nicht ob das denn wirklich an QT bzw. QODBC liegt. Nur der Verdacht ist ziemlich nahe, da es alles mit dem Query Analyzer einwandfrei hinhaut.

Eine andere Frage, ich habe bevor ich zu Programmieren begonnen habe mal das ganze Forum durchforstet und schön öfters MS SQL im Zusammenhang mit dem QTDS Treiber der Commercial Version gelesen. Was würde der denn für Vorteile im Gegensatz zum QODBC liefern.
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Geschwindigkeit und keine ODBC Umwandlung natürlich.
stefandetter
Beiträge: 7
Registriert: 8. November 2006 14:35
Wohnort: Rosenheim

Beitrag von stefandetter »

Aja. Es geht nur nicht wirklich aus der Doku hervor, dass der TDS für den MS SQL SERVER geeignet ist.

Kann man bei Bedarf auch ohne großartige Code Probleme umsteigen? Ist das Interface wirklich gleich?

Naja, und zu meinem Problem, wenn jemand das selbe Problem schon mal hatte, bitte melden.
stefandetter
Beiträge: 7
Registriert: 8. November 2006 14:35
Wohnort: Rosenheim

Beitrag von stefandetter »

Ich habe das ganze jetzt nochmal mit dem SQL Server 2005 Express Edition getestet.

Dabei habe ich herausgefunden, dass es anscheinend wirklich so ist, dass wenn in einer Prozedur mehr als ein SELECT Statement steht, es reicht auch schon ein DECLARE o.ä., dann werden die Werte, welche das SELECT liefert nicht zurückgeliefert.
stefandetter
Beiträge: 7
Registriert: 8. November 2006 14:35
Wohnort: Rosenheim

Beitrag von stefandetter »

Hab das Problem jetzt in den Griff bekommen. Hab zwar keine Erklärung, aber es geht jetzt.
Die magische Zeile:

Code: Alles auswählen

q.setForwardOnly(true);
Danke nochmal für die Hilfe.
Antworten