Seite 1 von 1

ADS: sp_mgGetConnectedUsers u.a. auch ohne DD?

Verfasst: Fr, 10. Nov 2023 15:01
von Tom
Ich will die erweiterten Infos nutzen, die die hauseigene Stored Procedure "sp_mgGetConnectedUsers" liefert, arbeite aber nicht mit einem Data Dictionary. Geht das?

Re: ADS: sp_mgGetConnectedUsers u.a. auch ohne DD?

Verfasst: Fr, 10. Nov 2023 15:04
von Marcus Herz
Ja

Re: ADS: sp_mgGetConnectedUsers u.a. auch ohne DD?

Verfasst: Fr, 10. Nov 2023 15:52
von Tom
Du hast dafür nicht zufällig ein Beispiel zur Hand? :wink:

Re: ADS: sp_mgGetConnectedUsers u.a. auch ohne DD?

Verfasst: Fr, 10. Nov 2023 22:00
von Marcus Herz

Code: Alles auswählen

Execute Procedere sp_mggetconnectedusers();
oder wo liegt dein Problem?
Das gibt dir einen cursor auf eine Tabelle zurück.
Das sollte auch mit der adsdbe funktionieren

Re: ADS: sp_mgGetConnectedUsers u.a. auch ohne DD?

Verfasst: So, 12. Nov 2023 14:50
von Tom
oder wo liegt dein Problem?
Ich habe und hatte das auf allen möglichen Wegen versucht, aber es läuft immerzu auf einen Fehler, eigenartigerweise bei "DbUseArea". Ich habe das als SQL-Kommando, über USQL und zuletzt so versucht:

Code: Alles auswählen

a := SqlExecSp("sp_mggetconnectedusers()",oSession,,.F.) // oSession ist die DAC-Session mit dem ADS


Es ist immer dasselbe: Ich bekomme einen 8999 (DbUseArea) in SQLEXECSP(158) (das ist die Funktion, auf die das Kommando EXECSP zeigt).

Re: ADS: sp_mgGetConnectedUsers u.a. auch ohne DD?

Verfasst: So, 12. Nov 2023 18:40
von Marcus Herz
ich schau mir das morgen mal m Büro an. Kann sein, ADSDBE untestützt das nicht. Aber damit kenne ich mich nicht mehr aus.

Re: ADS: sp_mgGetConnectedUsers u.a. auch ohne DD?

Verfasst: So, 12. Nov 2023 18:43
von Marcus Herz
hast du mal:

Code: Alles auswählen

a := SqlExecSp("execute procedure sp_mggetconnectedusers()",oSession,,.F.) // oSession ist die DAC-Session mit dem ADS
probiert. Wenn auch nicht, verusuch mal:

Code: Alles auswählen

a := SqlExecSp("select * from ( execute procedure sp_mggetconnectedusers())",oSession,,.F.) // oSession ist die DAC-Session mit dem ADS
Das muss funktionieren

Re: ADS: sp_mgGetConnectedUsers u.a. auch ohne DD?

Verfasst: So, 12. Nov 2023 18:57
von nightcrawler
Tom hat geschrieben: So, 12. Nov 2023 14:50

Code: Alles auswählen

a := SqlExecSp("sp_mggetconnectedusers()",oSession,,.F.) // oSession ist die DAC-Session mit dem ADS
wie Markus geschrieben hat: ein "execute procedure" davor. ADS kennt die Microsoft-Abkürzung nicht.

Re: ADS: sp_mgGetConnectedUsers u.a. auch ohne DD?

Verfasst: Mo, 13. Nov 2023 8:42
von Tom
Das funktioniert beides nicht, und vor allem bei der Variante mit "SELECT * FROM" hätte mich das auch gewundert, denn SqlExecSp() ist ja explizit (daher auch der Name) für das Ausführen einer Stored Procedure gedacht, nicht für die handelsüblichen SQL-Statements wie SELECT, INSERT, UPDATE usw.

Aber ganz egal, welche Syntax ich im Statement selbst verwende, ich erhalte immer diesen Fehler, und zwar in der Xbase++-Funktion "SqlExecSp()":
adsuser.png
adsuser.png (16.93 KiB) 1862 mal betrachtet
Und, wie gesagt - ich verwende kein Data Dictionary. Ich habe nur eine ganz normale DAC-Session mit dem ADS, und nutze ansonsten die ADSDBE.

Re: ADS: sp_mgGetConnectedUsers u.a. auch ohne DD?

Verfasst: Mo, 13. Nov 2023 9:04
von Tom
Dasselbe mit SqlGetResult (Statment "SELECT * FROM ( EXECUTE ..."), wieder ein 8999/DbUseArea, dieses Mal in SqlStmtExec.
Kann das an der ADS-Version liegen? Gibt's da ein Minimum?

Re: ADS: sp_mgGetConnectedUsers u.a. auch ohne DD?

Verfasst: Mo, 13. Nov 2023 9:12
von Tom
SqlCmd() immerhin erzeugt keinen Fehler, retourniert aber .F.

Re: ADS: sp_mgGetConnectedUsers u.a. auch ohne DD?

Verfasst: Mo, 13. Nov 2023 10:04
von Tom
Okay, Lösung gefunden. Ich erkläre später, worin sie bestand. Danke!

Re: ADS: sp_mgGetConnectedUsers u.a. auch ohne DD?

Verfasst: Mo, 13. Nov 2023 10:07
von Marcus Herz
Komisch, ich fin die Funktion SqlExecSP gar nicht. Auch in keinem Header File oder Doku!?!
Ich habe noch einiges probiert. Alles schlägt fehl. Das ist aber ein Problem der ADSDBE
z.B.

Code: Alles auswählen

   DbeInfo( COMPONENT_DATA , ADSDBE_TBL_MODE, ADSDBE_ADT )
   DbeInfo( COMPONENT_ORDER, ADSDBE_TBL_MODE, ADSDBE_ADT )
   DbeInfo( COMPONENT_DATA, ADSDBE_FREETABLE, .T. )
   oStmt1 := DacSqlStatement(oSession):fromChar("execute procedure sp_mggetconnectedusers()")
   oStmt1:build()
   oStmt1:query(USQL_RESULT_WORKAREA, "SP")
   // oder    
      use ("select * from (execute procedure sp_mggetconnectedusers()) x") alias sp via (oSession)

PS: da haben sich 2 Antworten zeitlich überschnitten

Re: ADS: sp_mgGetConnectedUsers u.a. auch ohne DD?

Verfasst: Mo, 13. Nov 2023 10:28
von Tom
Hallo, Marcus.

Ich habe die Funktion in der SQLCMD.CH gefunden. Sie wird angesprochen, wenn man das Kommando "EXECSP" verwendet.

Ich versuche noch, herauszufinden, warum es funktioniert. Ich habe schlussendlich eine Funktion verwendet, die Roger Donnay geschrieben und hier auch schon dokumentiert hat. Sie verwendet eine eigene Funktion "DC_AdsSqlStatement()", um mit einem ADS SQL zu quatschen, und diese wiederum verwendet eine eigene Klasse "DC_AdsStatement", die immer zwei Verbindungen zu einem ADS herstellt, eine Standard- und eine Dictionary-Verbindung, ganz unabhängig davon, ob man ein Dictionary verwendet oder nicht. Über DC_AdsSqlStatement lässt sich das EXEC PROC ... absetzen und antwortet mit einem Array von DataObjects. Roger umgeht da wohl einige Schwächen, die noch im USQL bzw. PTSQL stecken.

Re: ADS: sp_mgGetConnectedUsers u.a. auch ohne DD?

Verfasst: Mo, 13. Nov 2023 10:38
von Marcus Herz
in der sqlcmd.ch hab ich die auch gefunden, aber da wird am Anfang die odbcdbe.cd includiert. Denke, die Funktion ist wohl eher für diese DBE gedacht.
// Inhalt:
// Kommando-basiertes Nutzen von SQL via ODBCDBE in Xbase++

Re: ADS: sp_mgGetConnectedUsers u.a. auch ohne DD?

Verfasst: Mo, 13. Nov 2023 10:56
von Tom
Hallo, Marcus.
Denke, die Funktion ist wohl eher für diese DBE gedacht.
Das ist möglich. Beim SQL-Kommando ist es in der Hilfe auch explizit erwähnt, während sich EXECSP bei "Executing Stored Procedures" findet, das auch im ODBC-Kontext steht.

Aber - verwendet Ihr sp_mgGetConnectedUsers irgendwo? Und wenn ja, wie macht Ihr das?

enddo

Verfasst: Mo, 13. Nov 2023 11:37
von Marcus Herz
Ich hab ja AdsClass++, das rein auf der API basiert. Da hab ich all die Probleme nicht.
Ich kann das dann so abfragen:

Code: Alles auswählen

dbUser	:= AppDic():OpenSelect("execute procedure sp_mgGetConnectedUsers()")  // Appdic() ist das Connection Objekt
// un dann kann ich darüber skippen
do while !dbUser:eof()

	dbUser:skip()
enddo
dbUser:close()	


Re: ADS: sp_mgGetConnectedUsers u.a. auch ohne DD?

Verfasst: Mo, 13. Nov 2023 11:51
von Tom
Danke.

So macht Roger das auch.