Announcement

Collapse
No announcement yet.

Delphi, ADOStoredProc, MS SQL Server, eOleException

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Delphi, ADOStoredProc, MS SQL Server, eOleException

    Hi,

    Ich benutze Delphi 6.0 Enterprise, MS SQL Server 2000

    vom Delphi Programm rufe ich eine Stored Procedure auf und erhalte eine eOleException "undefined error".

    Diese Procedure läuft unter dem Enterprise Manager und dem SQL Query Analyzer korrekt und ohne Fehlermeldung und bearbeitet alle Daten korrekt.

    In der Prozedur erstelle ich einen CURSOR, öffne ihn, versuche ihn zu benutzen und schliesse ihn am Ende ordnungsgemäss.

    Der Fehler tritt auf wenn ich in der Stored Procedure einen FETCH Befehl benutze. Nehme ich den FETCH Befehl raus erhalte ich keine Fehlermeldung.

    Da die Delphi Routine durch eine Exception abgebrochen wird kann ich nicht auf Return Werte und Parameter zugreifen.

    Kann mir jemand verraten, was ich entweder bei der TADOStoredProc Komponente oder in der Stored Procedure einstellen muss, damit alles klappt ?

    hhocks

  • #2
    Hallo Helmut,

    kann dir dazu zwar keinen Tip geben, weil ich selber nur Delphi 5 Pro habe und mir daher die Adonis components gekauft habe, aber ich hatte auch ohne irgendwelche speziellen Einstellungen nie ein Problem mit Fetches in einer stored proc exekutiert mit ADO in Delphi, egal ob mit oder ohne result set.
    Habe aber schon öfter gehört, dass die standard ADO Komponenten in Delphi etwas buggy sein sollten. Würde das auf jeden Fall in Betracht ziehen und mal testweise eine stored proc schreiben, die nur einen ganz simplen cursor öffnet und wieder schliesst und kein result liefert und per ExecProc testen. Das dann langsam ausweiten auf Open und result set, bis sich der Fehler in Delphi einstellt. Anders wird es wohl kaum z ufinden sein.

    bye,
    Helmu

    Comment


    • #3
      Hallo hwoess,

      Danke für die Antwort.

      Habe alles schon probiert.

      Die original Procedure ist mittlerweile 994 Zeilen lang, enthält diverse INSERTS und UPDATES und arbeitet wunderbar wenn ich sie direkt im Enterprise Manager laufen lasse.

      Tatsächlich arbeitet die Procedure auch alles korrekt ab wenn ich sie von Delphi aus starte nur leider wird vom "Microsoft OLE DB Provider for SQL Server" am Schluss ein "Unspecified error" gemeldet und eine Exception ausgelöst.

      Wenn ich den FETCH Befehl in meiner Test Procedure oder im Original rausnehme erhalte ich keine Fehlermeldung.

      Weiß sonst noch jemand was ???

      bye, hwoes

      Comment


      • #4
        Hallo,

        wie sieht eine Minimal-Beispiel (Datenbanktabelle, Storded Procedure, ADO-Konfiguration) aus, mit dem sich dieses Problem jederzeit reproduzieren lässt? Liefert die SP eine Ergebnismenge zurück oder nur einen Rückgabewert (bzw. OUTPUT-Parameter)?

        Was passiert, wenn die Stored Procedure über <b>TADODataSet</b> (Eigenschaft <i>CommandType</i> = <i>cmdStoredProc</i>) ausgeführt wird und auch die Eigenschaft <b>ExecuteOpitions</b> an den Typ der Stored Procedure (siehe oben) angepasst wird

        Comment


        • #5
          Hi, Danke

          Hier ein Mini Beispiel
          ===========================================
          CREATE PROCEDURE [dbo].[hh5]
          @par1 INT = 0,
          @par2 INT = 0,
          @par3 INT OUTPUT
          AS

          DECLARE @VAR1 INT
          DECLARE @VAR2 INT
          DECLARE @PostError INT
          DECLARE @CC INT
          DECLARE @F1 INT
          DECLARE @F2 VARCHAR(50)
          DECLARE @F3 DATETIME
          DECLARE @F4 MONEY
          DECLARE @CR INT

          SET @PostError = 0
          SET @par3 = 501803

          -- SET NOCOUNT ON
          SET XACT_ABORT ON

          SELECT @CR = COUNT(*) FROM TE1

          DECLARE MC CURSOR LOCAL SCROLL STATIC READ_ONLY
          FOR
          SELECT ir, f1, f2, f3, f4 FROM TE1 ORDER BY ir
          OPEN MC -- open cursor
          IF @CR > 0
          BEGIN
          SET @VAR1 = 100
          -- =================================
          -- wenn ich die naechste Zeile rausnehme
          -- klappt es
          -- =================================
          FETCH ABSOLUTE 1 FROM MC

          -- andere FETCH Befehle erzeugen
          -- den gleichen Fehler

          BEGIN TRANSACTION PostToFibu

          SET @CC = 1

          WHILE ( @CC <= @CR )
          BEGIN
          SELECT @F1=f1, @F2=f2, @F3=f3, @F4=f4
          FROM TE1
          WHERE IR = @CC

          INSERT INTO te2 (ir,f1,f2,f3,f4 )
          VALUES ( @CC,@F1,@F2,@F3,@F4 )
          SET @CC = @CC + 1
          END
          COMMIT TRANSACTION PostToFibu
          END
          SELECT * FROM TE2 -- nur zum Testen
          UPDATE TE2 SET f4 = 555.55 -- nur zum Testen
          -- ======================================
          CLOSE MC
          DEALLOCATE MC
          RETURN @PostError
          GO

          Ist das Beispiel gut genug ? Dieses Beispiel habe ich benutzt um mit den verschiedenen Delphi Komponenten zu "spielen".

          Eine Ergebnismenge erwarte ich nicht,
          einen Returnwert und Output Parameter aber schon.

          Ich habe alle TADO-Kompnenten durchprobiert
          mit allen Einstellungen die zur Vefuegung stehen. (soweit ich nichts uebersehen habe)

          Zur Zeit arbeite ich an einer Ersatz-Loesung und deklariere eine Tabellen Variable

          DECLARE @Voucher TABLE
          (
          IntRef INT IDENTITY(1,1),
          DocNo INT,
          DocDate DATETIME,
          DocType CHAR(2)
          )

          Die richtige Tabelle hat ein paar mehr Felder.
          Dann fuelle ich die Tabelle mit Daten und kann ueber "IntRef" auch gezielt auf einzelne Eintraege zugreifen. Ob alles funktioniert wird sich heute rausstellen.

          Bei uns hier (zur Zeit Iran, Teheran) ist Donnerstag und Freitag Wochenende und Samstag und Sonntag wird gearbeitet.

          Nochmals besten Dank

          Helmut Hock

          Comment


          • #6
            Hallo Helmut,

            fast wie ich es mir gedacht habe: beim Fetch fehlen die Variablen, in die die gefetchen Werte eingelesen werden und das stösst ADO sauer auf. Fetch sollte also so aussehen:

            FETCH ABSOLUTE 1 FROM MC into @cc, @f1, @f2, @f3, @f4

            .. und dann sollte es gehen.

            bye,
            Helmut Wös

            Comment

            Working...
            X