Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Stored Procedure startet nicht

Begonnen von MartinHan, Februar 27, 2025, 13:14:14

⏪ vorheriges - nächstes ⏩

MartinHan

Hallo,

auf dem Server liegt eine STP. Wenn ich diese auf dem Server aufrufe, klappt es fehlerfrei.
Nur wenn sie aus Access aufrufen will,kommt nix zurück.
Ich habe jetzt einen Insert in eine kleine Tabelle eingebaut, der wird ausgeführt, aber es kommen keine Daten zurück. der Wert cmd.Parameters(0).Value ist auch nicht null, aber ich kann nicht sehen, was da drin steht.

Function getvalidvalues(keyname As String, keyvalue As Long, tablename As String) As Integer
 
    Dim conn As ADODB.connection
    Dim cmd As ADODB.Command
    Dim rs As ADODB.Recordset
   
   
    On Error GoTo myerror
   
    getvalidvalues = 0
   
    ' Verbindung zur SQL Server-Datenbank herstellen
    Set conn = CreateObject("ADODB.Connection")
    conn.connectionString = Forms![start menue]!tab_connstr
     conn.Open
 
    ' Befehl-Objekt erstellen
    Set cmd = CreateObject("ADODB.Command")
   
    With cmd
   
        .ActiveConnection = conn
        .CommandType = 4 ' adCmdStoredProc
        .CommandText = " [dbo].[getvalidvalues]"
       
        ' Parameter für die Prozedur setzen
        .Parameters.Append cmd.CreateParameter("ReturnValue", adInteger, adParamReturnValue)
        .Parameters.Append cmd.CreateParameter("@keyname", adVarChar, adParamInput, 15, keyname)
        .Parameters.Append cmd.CreateParameter("@keyvalue", adInteger, adParamInput, , keyvalue)
        .Parameters.Append cmd.CreateParameter("@tablename", adVarChar, adParamInput, 50, tablename)
       
      End With
   
    ' Prozedur ausführen
    Set rs = cmd.Execute()
   
    If cmd.Parameters(0).Value = -1 Then


-- =============================================
-- Author:      Martin
-- Create date: 29.1.2025
-- Description:   Rückgabe von Tabellen Wertenqr
-- =============================================
ALTER     PROCEDURE [dbo].[getvalidvalues]
     @keyname as nvarchar(25)
   ,@keyvalue as int
   ,@tablename as nvarchar(50)   
as
Begin
   begin try
    print 'Eingansparameter:'+ @keyname + N' ' + str(@keyvalue) + N' ' +  @tablename;   
       insert into warda (warda,wann) values(N'aus getvalidvalues',getdate())

        declare @strsql as nvarchar(200);
      set @strsql = N'select validfrom, validto from ' + @tablename + N' where ' + @keyname + ' = ' + STR(@keyvalue);
       print'SQL: ' + @strsql
        EXEC sp_executesql @strsql;
       return(0)
    end try

   begin catch
      print'Fehler: ' + @strsql
      return(-1)
   end catch
end

Danke für Hilfe

Martin

   
Es gibt nichts gutes, außer, man tut es! EK

PhilS

Zitat von: MartinHan am Februar 27, 2025, 13:14:14      set @strsql = N'select validfrom, validto from ' + @tablename + N' where ' + @keyname + ' = ' + STR(@keyvalue);
      print'SQL: ' + @strsql
        EXEC sp_executesql @strsql;
Deine Verwendung der STR Funktion erscheint mir hier ziemlich verdächtig. Kann es sein, dass du VBA-STR() mit TSQL-STR() verwechselt hast? Die beiden Funktionen heißen gleich, funktionieren aber unterschiedlich.

Wenn der Einsatz von STR Sinn ergeben soll, dann musst du den Rückgabewert von STR als Zeichenfolge behandeln; d.h. wie üblich die Zeichenfolgebegrenzer um den Wert setzen.

PS: OK, ich glaube ich verstehe jetzt, du suchst hier nach: CAST(@keyvalue AS Nvarchar)


Dein Hauptproblem dürfte hier sein, dass die Ausgaben deiner PRINT-Statements in der Stored Procedure von ADO als verstümmelte Recordsets interpretiert werden. In dem Zusammenhang empfiehlt sich auch ein SET NOCOUNT ON; in der Stored Procedure.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

MartinHan

#2
Danke für deine Message.
Ich habe jetzt alle Print Befehle entfernt, aber es kommt immer noch nix.

use [DbAdcProduktion]
go

exec [dbo].[getvalidvalues] "personid",120417,"history.person"
go

validfrom
2025-02-26 21:08:20
validto
2025-02-27 11:05:15

Auf dem Server kommt das richtige Ergebnis.
Soe sieht jetzt die Prz aus:

ALTER     PROCEDURE [dbo].[getvalidvalues]
     @keyname as nvarchar(25)
   ,@keyvalue as int
   ,@tablename as nvarchar(50)   
as
Begin
   begin try
 
       insert into warda (warda,wann) values(N'aus getvalidvalues',getdate())

        declare @strsql as nvarchar(200);
      set @strsql = N'select validfrom, validto from ' + @tablename + N' where ' + @keyname + ' = ' + CAST(@keyvalue AS Nvarchar)
    
        EXEC sp_executesql @strsql;
       return(0)
    end try

   begin catch
    
      return(-1)
   end catch
end

Ich nutze auch einige andere Prozeduren, keine Probleme.
Ich versuche jetzt mal vom dynamischen SQL auf statisch, nur zum Test.
Es gibt nichts gutes, außer, man tut es! EK

MartinHan

Ich bin da echt mit meinem Latein am Ende. ich habe mehrere STP, die fehlerfrei sich mit Access unterhalten...
Nun, ich habe jetzt einen Workaround. Die Historie Tabellen sind auch als verpnüpfte Tabellen vorhanden, also hole ich mir die Daten daraus.
Vielleicht hilft es ja ma darüber zu schlafen....

Martin
Es gibt nichts gutes, außer, man tut es! EK

PhilS

Zitat von: MartinHan am Februar 27, 2025, 17:24:02Vielleicht hilft es ja ma darüber zu schlafen....
Manchmal hilft es auch, die erhaltenen Antworten nochmal in Ruhe zu lesen:

Zitat von: PhilS am Februar 27, 2025, 14:03:23In dem Zusammenhang empfiehlt sich auch ein SET NOCOUNT ON; in der Stored Procedure.
Idealerweise direkt am Anfang der Stored Procedure.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

MartinHan

Hi,

ich muss mich bei dir entschuldigen, aber wenn den den ganzen Tag auf Fehlersuche war, geht schon mal was durch.
Tatsache ist, es läuft!

Nochmal sorry und vielen Dank!

Martin
Es gibt nichts gutes, außer, man tut es! EK