Es liegt vermutlich an einem Windows Update am 11.11.2022:
Kumulatives Update **KB5020694 **vom 8. November 2022 für .NET Framework 3.5, 4.8 und 4.8.1 für Windows 10, Version 22H2
Kann das wer bestätigen ?
Auf den Systemen bei denen das Problem bei unseren Anwendern auftritt ist das Update nicht installiert. Hab's gerade geprüft.
Darüber habe ich auch schon nachgedacht, Verbindungsabbrüche sind zwar nicht protokolliert, ich werds aber mal testen die Anwendung lokal auf den Rechner zu legen.
Hallo Leute,
wir haben eine größere .NET-Anwendung (Windows Forms) die speziell auf einer Workstation Probleme macht.
Das Problem stellt sich wie folgt dar:
Im Ereignisprotokoll finde ich dann folgenden Eintrag:
Fehlermeldung:
Name der fehlerhaften Anwendung: Anwendung.exe, Version: 2022.7.5.211, Zeitstempel: 0x62ebcd0a
Name des fehlerhaften Moduls: clr.dll, Version: 4.8.4515.0, Zeitstempel: 0x624ce98e
Ausnahmecode: 0xc0000005
Fehleroffset: 0x00000000006833c0
ID des fehlerhaften Prozesses: 0x45c
Startzeit der fehlerhaften Anwendung: 0x01d8f4c71298d974
Pfad der fehlerhaften Anwendung: \SERVER\Application\Anwendung.exe
Pfad des fehlerhaften Moduls: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Berichtskennung: 86beaba4-dad9-4edd-8c91-4bf7071dfea3
Vollständiger Name des fehlerhaften Pakets:
Anwendungs-ID, die relativ zum fehlerhaften Paket ist:
- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
- <System>
<Provider Name="Application Error" />
<EventID Qualifiers="0">1000</EventID>
<Version>0</Version>
<Level>2</Level>
<Task>100</Task>
<Opcode>0</Opcode>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2022-11-10T10:05:00.9500007Z" />
<EventRecordID>7319</EventRecordID>
<Correlation />
<Execution ProcessID="0" ThreadID="0" />
<Channel>Application</Channel>
<Computer>workstation.domain.intern</Computer>
<Security />
</System>
- <EventData>
<Data>Anwendung.exe</Data>
<Data>2022.7.5.211</Data>
<Data>62ebcd0a</Data>
<Data>clr.dll</Data>
<Data>4.8.4515.0</Data>
<Data>624ce98e</Data>
<Data>c0000005</Data>
<Data>00000000006833c0</Data>
<Data>45c</Data>
<Data>01d8f4c71298d974</Data>
<Data>\\SERVER\Application\Anwendung.exe</Data>
<Data>C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll</Data>
<Data>86beaba4-dad9-4edd-8c91-4bf7071dfea3</Data>
<Data />
<Data />
</EventData>
</Event>
Unbehandelte Ausnahmen werden abgefangen und es wird dann eine Messagebox angezeigt und die Ausnahme in der Logdatei protokolliert. In diesem Fall passiert das aber nicht.
AppDomain.CurrentDomain.UnhandledException += new System.UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Natürlich habe ich schon eine ganze Weile nach der Access Violation (0xc0000005) gegoogelt. Ich finde aber nur relativ allgemeine Tips, wie Virenscanner deaktivieren, .NET-Runtime neu installieren, usw. was wir natürlich schon gemacht haben.
Gibt es einen Weg die Ursache zu ermitteln? Liege ich richtig mit meiner Annahme, dass das nur mit ProcDump + Windbg gehen wird?
Danke & Gruß hypersurf
Gibt es noch Antiviren Lösungen, wo man dem User / Entwickler die Möglichkeit in die Hand geben kann, verzeichnisse von Real time Scan zu excluden?
Wir setzen ESET inkl. zentraler Steuerung ein. Gerade auf meinem lokalen Client erfolgreich ausprobiert ein einzelnes Verzeichnis zu excluden.
Das TreeView ist viel übersichtlicher als die vorherige Variante. Ich würde definitiv das TreeView nehmen. Zudem bist Du nicht eingeschränkt, falls mal aus irgendwelchen Gründen noch eine Ebene dazu kommen soll.
Liegt's vielleicht daran, dass "user" ein reserved Word in Access ist?
Ich hab' das Problem auch täglich. Egal ob Forms oder WPF.
Danke für Eure Antworten und sorry für meine späte Antwort, hatte einfach noch keine Gelegenheit ausführlich zu antworten 🙂
Habt ihr keine Exception/Stacktrace für die ursachen Forschung?
Doch haben wir, manchmal sind die Abläufe aber komplexer, oder es entstehen einfach durch die einzigartige Bedienweise der Software durch die Benutzer Unhandled Exceptions deren Ursache wir nicht ohne weiteres nachvollziehen können.
Klar sehen wir anhand der Exception wo es zum Fehler kommt, der Weg dahin ist aber nicht immer reproduzierbar. Ich stelle mir eine Lösung vor die einfach permanent loggt, so dass wir im Fehlerfall viel schneller nachvollziehen können, was der Benutzer direkt vor dem Fehler gemacht hat.
Was für einen Fehler habt ihr?
Zuletzt hatten wir einen Deadlock durch nicht ganz sauber umgesetzte asynchrone Abläufe. Das ließ sich letztendlich einfach beheben, nachdem wir wussten an welcher Stelle die Problematik auftritt. Da hätten wir durch vorhandenes, permanentes Logging viel Zeit sparen können.
Was ich auch empfehlen kann, wäre z.B. mit Sentry zu arbeiten.
Der Einbau ist sogar relativ einfach und gut dokumentiert.
Finde ich sehr interessant und werden wir uns definitiv anschauen.
Was Du schreibst, klingt ein bisschen so, als wär euer Logging selbst geschrieben?
Jop ist es. Und es ist an der Zeit das durch eine vernünftige Lösung zu ersetzen, die uns Fehlersuche erleichtert und dadurch letztendlich Zeit spart.
Alle Methoden zu protokollieren ist der völlig falsche Weg. Das hat noch nie wirklich sinnhaftig funktioniert.
Wenn ich aber den Ablauf durch den ein Fehler entsteht nachvollziehen kann, komme ich meiner Erfahrung nach viel schneller an die Ursache.
Der moderen Weg des Loggings nennt sich Full Structured Logging; eine Implementierung im .NET Ökosystem ist zB.
>
Weiterhin sollte ein Logging auch immer Teil der Software Architektur sein, zB über Operation based Logging.
Operation based Logging wird zB auch in AWS, Google Cloud, Azure ... verwendet, um die genauen Abläufe in der Cloud zu protokollieren, zB auf Basis von Application Insights.
Wie wir das umgesetzt haben ist in
> beschrieben (so wende ich das auch in allen Kundenprojekten sowohl Architektur wie auch Implementierung an).
Danke, genau das habe ich gesucht. Hab' mir Serilog heute Mittag schonmal zwei Stunden angeschaut und werd's morgen mal mit den Kollegen besprechen.
PS: Gebt mir bitte mal einen Tipp wie ich mich technologisch besser auf dem aktuellen Stand halten kann. D. h. welche Quellen sind gut um sich über aktuelle Entwicklungen und Vorgehensweisen auf dem aktuellen Stand zu halten? Ich hab' durch die viele Arbeit öfter mal das Gefühl hinterher zu hinken.
Gruß hypersurf
Hallo Leute,
ich habe folgende Problemstellung:
Ich möchte alle Methodenaufrufe protokollieren können um nicht direkt nachstellbare Probleme/Bugs in unserer Software leichter beheben zu können. Aktuell können wir den internen Loglevel erhöhen und alle Methodenaufrufe werden in eine Logdatei geschrieben. Das ist im Alltag nicht praktikabel, weil dadurch die ganze Software langsam wird.
Ich könnte alle Methodenaufrufe auch in eine Queue schreiben, welche dann in einem separaten Thread irgendwohin geschrieben wird. Das bringt mir aber nichts, wenn das Programm abstürzt und die Einträge aus der Queue zum Zeitpunkt des Absturzes noch nicht vollständig weggeschrieben sind.
Wie machen das andere Programme? Bei List & Label gibt es beispielsweise die debwin3.exe in der in Echtzeit alles angezeigt wird was in List & Label gerade passiert.
Ich dachte daran, vielleicht eine Art Logserver zu schreiben, der beispielsweise mittels SignalR die Methodenaufrufe mitgeteilt bekommt und sie dann wegschreibt.
Wie würdet Ihr das lösen?
Gruß hypersurf
Das ganze nennt sich Zugriffsmodifizierer und gehört zu den Grundlagen von OOP. Zugriffsmodifizierer geben die Möglichkeit, einfach zu steuern, wer wann auf welche Weise auf Klassen, Properties, Events, Felder und Methoden zugreifen darf.
Ist alles identisch zu anderen Benutzern. Es muss irgendwas sein, was der Benutzer mit in die Sitzung bringt.
Wir verschieben den Benutzer jetzt auf einen anderen Server und schauen mal, ob das Problem noch auftritt.
Also wenn es nur ein Benutzer ist, wird es meiner Meinung nach nicht an dem Framework des Servers liegen. In der RDP Verbindung kannst du lokale Ressourcen mal alles deaktivieren bis auf Zwischenablage (auch die Remoteaudioeinstellungen).
Das hatten wir schon versucht, also Druckerweiterleitung, und was man sonst so mit in die Sitzung nehmen kann deaktiviert.
Ich hatte einen ähnlichen Fall mal mit dem PDF-Drucker von DATEV (SkyPDF heißt der glaub' ich). War dieser mit auf dem Server installiert kam es zu völlig sinnlosen Abstürzen, damals gabs aber einen Verweis auf den Drucker in den Einträgen im Eventlog.
Wie sind die User mit dem Server verbunden? Gibt es hier eine AUusnahme welche nur auf diesen User zutrifft (z.B. VPN wegen HO?)
Alle über's lokale Netzwerk.
Stellt ihr die Applications als RemoteApp zur Verfügung?
Nope, jeder hat seinen eigenen Desktop auf dem Server und startet dann die Anwendung. Außer der Anwendung läuft sonst nichts auf dem Server (keine weitere Software installiert).
Yes, wir installieren am WE mal das Framework auf dem Server neu. Das Benutzerprofil hatten wir schon neu eingerichtet, hatte leider keine Auswirkung.
Kann's theoretisch auch etwas sein, was der Nutzer mit in die Sitzung bringt (Druckerweiterleitung)??
Werd' ich am Wochenende mal versuchen. Komisch ist wirklich, dass das Problem nur bei einem einzigen Benutzer (es sind 35 auf dem RDP-Server) auftritt.
Hallo Leute,
ich hab' bei einem einzigen Benutzer das Problem, dass unsere Anwendung ohne zutun des Benutzers abstürzt (siehe Anhang). D. h. der Benutzer schaut nur auf die Eingabemaske und die Anwendung stürzt ohne weitere Benutzereingabe ab. Das ganze passiert total sporadisch und so gut wie in jeder vorhandenen Eingabemaske.
In der Main-Methode fangen wir UnhandledExceptions natürlich ab und handeln diese entsprechend. Das funktioniert auch immer - nur bei der oben beschriebenen Problematik nicht.
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
AppDomain.CurrentDomain.UnhandledException += new System.UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
TaskScheduler.UnobservedTaskException += new EventHandler<UnobservedTaskExceptionEventArgs>(TaskScheduler_UnobservedTaskException);
Im Ereignisprotokoll werden bei diesen Abstürzen zwei Ereignisse protokolliert:
EventId 1000:> Fehlermeldung:
Name der fehlerhaften Anwendung: xxxx.exe, Version: 1.0.0.0, Zeitstempel: 0x609ab544
Name des fehlerhaften Moduls: ntdll.dll, Version: 10.0.14393.4350, Zeitstempel: 0x606eaf8d
Ausnahmecode: 0xc000000d
Fehleroffset: 0x00000000000fe2ec
ID des fehlerhaften Prozesses: 0xcd2c
Startzeit der fehlerhaften Anwendung: 0x01d756aaa6428410
Pfad der fehlerhaften Anwendung: D:\Application\Application\xxxx.exe
Pfad des fehlerhaften Moduls: C:\Windows\SYSTEM32\ntdll.dll
Berichtskennung: 27bc97d4-0852-41ce-af0f-42c5660e0e54
Vollständiger Name des fehlerhaften Pakets:
Anwendungs-ID, die relativ zum fehlerhaften Paket ist:
- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
- <System>
<Provider Name="Application Error" />
<EventID Qualifiers="0">1000</EventID>
<Level>2</Level>
<Task>100</Task>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2021-06-01T16:34:56.256651000Z" />
<EventRecordID>2050995</EventRecordID>
<Channel>Application</Channel>
<Computer>TERM</Computer>
<Security />
</System>
- <EventData>
<Data>xxxx.exe</Data>
<Data>1.0.0.0</Data>
<Data>609ab544</Data>
<Data>ntdll.dll</Data>
<Data>10.0.14393.4350</Data>
<Data>606eaf8d</Data>
<Data>c000000d</Data>
<Data>00000000000fe2ec</Data>
<Data>cd2c</Data>
<Data>01d756aaa6428410</Data>
<Data>D:\Application\\Application\xxxx.exe</Data>
<Data>C:\Windows\SYSTEM32\ntdll.dll</Data>
<Data>27bc97d4-0852-41ce-af0f-42c5660e0e54</Data>
<Data />
<Data />
</EventData>
</Event>
EventId 1026:> Fehlermeldung:
Anwendung: xxxx.exe
Frameworkversion: v4.0.30319
Beschreibung: Der Prozess wurde aufgrund einer unbehandelten Ausnahme beendet.
Ausnahmeinformationen: Ausnahmecode c000000d, Ausnahmeadresse 00007FFB9028E2EC
Wir verwenden das .NET Framework 4.5.1 auf einem Windows 2016 Remotedesktopserver.
Natürlich habe ich schon stundenlang (eher tagelang) im Netz nach einer Lösung gesucht, aber keine gefunden die mich irgendwie auf die Spur zur Ursache führen könnte.
Ganz einfache Ansätze wie Serverneustart, Virenscanner ausschalten, usw. haben wir natürlich schon ausprobiert.
Mittlerweile läuft fast täglich procdump (procdump -accepteula -e -ma pid) auf den Prozess des Benutzers, leider ist der Fehler noch nie aufgetreten während procdump lief (darauf warten wir aktuell noch).
Woran liegt es, dass der Fehler nicht durch die Event-Handler für die Unhandled Exceptions gefangen wird? Ist ein Memorydump der einzige Weg die Ursache zu ermitteln?
Danke & Gruß
hypersurf
Ich hab' das Problem auch öfter bei verschiedenen UserControls. Meistens hilft es einmal alle Klassen zu schließen, das Projekt zu bereinigen, zu erstellen und es dann nochmal zu versuchen. Wenn das auch nichts hilft ignoriere ich den Fehler meistens (gibt ne Schaltfläche dazu), kontrolliere dann aber via GIT ob beim Ignorieren irgendwas verloren gegangen ist.
Schau mal How to: Reduce Graphics Flicker with Double Buffering for Forms and Controls, das hilft in der Regel gegen Flackern bei WinForms.
Ich verstehe die Problemstellung nicht. Habt Ihr keine Schnittstellenbeschreibung von dem Programm mit dem Ihr kommunizieren wollt?
Kannst Du mal Deinen Code posten, dann können wir Dir mit Sicherheit helfen 🙂
Irgendwas wird wohl null sein, sonst würd's keine NullReferenceException geben.
Wenn die Exception erst in Zeile 11 geworfen wird, würde ich schätzen, dass tsslColValue null ist.
Für mich sieht der Connectionstring nicht richtig aus. Jedenfalls sieht meiner (ich arbeite täglich mit MySQL & MariaDB) anders aus 🙂
Server=localhost;Port=3306;Database=myDataBase;Uid=root;Pwd=myPassword;
War ODAC nicht nur eine Sammelung der Datenbankzugriffskomponenten von Oracle?
64-bit Oracle Data Access Components (ODAC) for Windows | Oracle Deutschland
Vielen Dank für die Arbeit und Zeit die Ihr in das Projekt investiert 🙂
Hier steht die Lösung: https://www.mycsharp.de/wbb2/thread.php?threadid=21782
Bulk-Inserts werden unter MySQL scheinbar nicht so unterstützt wie von MS SQL Server. Wenn ich es richtig verstehe basiert das Ganze auf fileinput. Da das auch wieder IO lastig ist, würde es das Problem nur verlagern.
Bulk-Inserts werden unterstützt:
INSERT INTO table_name (column_list)
VALUES
(value_list_1),
(value_list_2),
...
(value_list_n);
Ich nutze das tagtäglich 😃
Teste mal folgende Änderungen an der my.ini:
innodb_flush_log_at_trx_commit=2
max_allowed_packet=16M
Dann wäre es zusätzlich interessant die Tabellenstruktur inkl. Indizes zu kennen, da "zu viele" Indizes die Performance beim Einfügen von Datensätzen negativ beeinflussen können.
Ich gehe mal davon aus, dass Du InnoDB verwendest.
Eine Optimierung der Datenbankkonfiguration könnte wohl helfen.
Das die Platte ausgelastet wird wundert mich nicht:
InnoDB must flush the log to disk at each transaction commit if that transaction made modifications to the database. When each change is followed by a commit (as with the default autocommit setting), the I/O throughput of the storage device puts a cap on the number of potential operations per second.
Kannst Du mal Deine my.cnf/my.ini anhängen?
phpBB was die ganzen Jahre verwendet wurde ist ja auch OS
Es ist doch gar kein phpBB sondern ein Woltlab Burning Board (2.x)?
Super, das hilft mir schonmal sehr weiter. Danke Dir 😃
Hallo Leute,
ich bräuchte mal Eure Unterstützung bzw. einfach ein paar Stichworte mit welchen Technologien ich das ganze umsetzen kann.
Ich möchte eingehende Telefonanrufe unseres Telefonanbieters Placetel auf unseren Clients anzeigen. Hierfür bietet Placetel eine Notify-API welche POST-Requests mit den Anruferdaten sendet.
Die RestAPI zu schreiben an welche die POST-Requests gehen ist soweit kein Problem. Aber mit welcher Technologie gebe ich die Informationen an die Clients weiter?
Ich hatte mir das ganze so vorgestellt:
1.) Eingehender POST-Request (z. B. ein Anruf) durch die Placetel-Notify-API
2.) Die RestAPI verarbeitet den Request und leitet diesen an bestimmte Clients weiter.
3.) Auf den Clients werden dann der Anruf und diverse weitere Informationen zu dem Anrufer angezeigt.
Mit welcher Technologie kann ich die Clients aus der RestAPI heraus mit Informationen versorgen?
Gruß hypersurf
Nunja ich denke wenn ich eine gewisse Motivation zeigen kann und auch schon selbst kleinere Projekte zum vorzeigen habe, mit denen ich auch zeigen kann das ich genau weiß worauf ich mich einlasse, meine nicht all zu hohe Chance wegen des Abschlusses zu erhöhen ^^.
Ich bin selber Arbeitgeber und finde den Abschluss nicht problematisch. Meiner Erfahrung nach kommt es eher auf die Motivation und den Willen an immer neue Dinge zu lernen.
Ich hab' zwei kostenlose Kredikarten. Die eine von der DKB um im Ausland kostenlos Geld abholen zu können und die andere mit einem hohen Limit um Flüge und Reisen buchen zu können.
Im Alltag nutze ich eigentlich nur die EC-Karte zum Bezahlen. Ich hab so gut wie nie mehr als 20 € Bargeld in der Tasche. Seit Corona kann man auch bei jedem Bäcker mit Karte zahlen bei uns. Zum Tanken hab' ich Tankkarten.
Alternativ geht es auch per Event:
Properties.Settings.Default.SettingChanging += SettingChanging;
void SettingChanging(object sender, System.Configuration.SettingChangingEventArgs e)
{
// bubu
}
Dafür gibt es "Unhandled Exception"-Handler mit denen man unbehandelte Ausnahmen abfangen kann.
Du kannst auch einen Blick in das Ereignisprotokoll werfen, da werden unbehandelte Ausnahmen, die eine Anwendung zwangsweise beenden mitunter protokolliert.
kostenlose Alternativen hab ich noch keine gesehen, ein Tipp wäre nicht schlecht.
Ich hab' auch länger gesucht und keine kostenlosen alternativen gefunden (heißt nicht, dass es sie nicht gibt), die auch alle PDF-Dateien korrekt anzeigen konnten. Bei PDF-Dateien mit eingebetteten Schriftarten hatte ich oft das Problem, dass die Librarys diese nicht gerendert haben und die PDFs dann halt leer waren.
Wir verwenden für die reine Anzeige jetzt das Produkt PDFPrinting.NET von Terminalworks (nur den Viewer).
Sollte man beides im Jahr 2020 nicht unbedingt mehr tun - übrigens auch nicht in PHP.
Als sicherer gelten hier die Umgebungsvariablen.
Aus Interesse: Warum sind Umgebungsvariablen sicherer?
Speicher die Datenbankzugangsdaten (verschlüsselt) in einer Konfigurationsdatei (dafür bietet .NET auch schon entsprechende Klassen).
Auf der MySQL-Seite gibt's entsprechende Beispiele
Das kannst Du selber steuern.
Ist die richtige Version der ActiveX-Komponente registriert? Hast Du die Komponente mit regasm registriert?
Hallo Leute,
ich möchte mir neue Hardware zulegen und stehe vor der AMD- oder Intel-Entscheidung. Ich hatte bisher immer Intel-CPUs. Ich kann mich daran erinnern, dass der Android-Emulator (von Android-Studio) auf AMD-CPUs in der Firma damals nicht lief (ist schon ein paar Jahre her).
Gibt es das Problem heutzutage mit aktuellen Ryzen-CPUs auch noch, oder läuft der Emulator von Android-Studio einwandfrei auf aktuellen Ryzen-CPUs? Habt Ihr Erfahrungen damit?
Gruß hyper
Ich nutze immer FluentFTP und bin damit sehr zufrieden. Den asynchronen Aufruf kannst Du selber machen.
Ich dachte immer ein Dienst macht nur gerade so viel wie notwendig und delegiert wenn möglich alles andere. Daher hatte ich die Idee dass es sinnvoller wäre ein Programm zyklisch aufzurufen, zu mal es doch auch einfacher ist ein gewöhnliches Programm besser zu handhaben als einen Dienst?
Ich würde einen Dienst immer einer Anwendung die z. B. über die Aufgabenverwaltung gestartet wird vorziehen. Dienste werden in der Regel auch überwacht, so dass der Admin mitbekommt, dass ein wichtiger Dienst ausgefallen ist.
Ich fange in jedem Dienst die Unhandled Exceptions ab und schreibe diese wahlweise in eine Logdatei oder auch ins Ereignisprotokoll. So kriegt man eigentlich recht fix raus, woran es liegt. Ansonsten lassen sich Dienste ja auch debuggen um die Absturzursache zu ermitteln.
Ich bin auch selbständig (Branchensoftware für Handwerksbetriebe und Industrie) und wir sehen aktuell einen deutlichen Rückgang der Anfragen von Interessenten. Ein direkten Einfluss auf unsere Finanzen hat Corona aber bisher noch nicht.
Unsere Mitarbeiter können auf Wunsch eh Homeoffice machen, von daher hat sich die Situation gar nicht so stark verändert. Dank moderner Technik merken die Kunden gar nicht ob derjenige mit dem er spricht zuhause oder im Büro sitzt.
Ansonsten kann man den Report auch über die CR-API öffnen und die Feldgrößen mittels API auf eine einheitliche Höhe einstellen.
Ich erinnere mich nicht mehr ganz genau (ist schon eine Weile her), aber war die Feldhöhe in CR nicht von der Defaultschriftart und -Größe abhängig?
ich kriege die Rückmeldung 3, dies bedeutet, dass er nicht auf bkz_2004.kpr zugreifen kann. Ist meine Pfadangabe falsch?
Was soll "Rückmeldung 3" sein? Wie lautet die genaue Fehlermeldung und in welcher Zeile tritt sie auf? Was sagt die Beschreibung/Dokumentation der API zu dem Problem?
Läuft das auf der Quest?
Ich persönlich würde das gar nicht über eine einzige SQL-Abfrage, sondern über c#-Routinen mit mehreren SQL-Abfragen lösen. Das macht es in der Regel einfacher zu lesen (für sich selber und ggf. auch für andere Entwickler).
Das wird vermutlich daran liegen, dass Du proc in der Methode Ping() nochmal definierst (zusätzlich zur Klasse).
Gar nicht, ich würde die Tabellen so aufbauen, dass man die Inhalte optimal abfragen kann. Wayne Speicherplatz..