Announcement

Collapse
No announcement yet.

MIDAS 'Allgemeiner SQL-Fehler'

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

  • MIDAS 'Allgemeiner SQL-Fehler'

    Ich erhalte in verschiedenen MIDAS Applikationen unregelmässig folgende <br>
    Fehlermeldung:<br>
    Allgemeiner SQL-Fehler<br>
    Error reading data from then connenction.<br>
    Die Client-Anwendung muß ich danach schliessen und neu starten.<br>
    Die Server laufen unter NT 4.0 SP 6. Als Client W95 - W2000<br>
    Delphi 5, Interbase 6 und BDE 5.11<br>

    Hat jemand eine Erklären woher dieser Fehler kommt?

    Gruß<br> Horst

  • #2
    Hallo,

    über welchen Verbindungsweg (DCOM, TCP/IP, HTTP oder RDS) greift der Client auf den MIDAS-Server zu. Wenn der Client <b>TSocketConnection</b> verwendet, ist der <b>Borland Socket Server</b> (BSS) auf der Server-Seite für die Anbindung zum MIDAS-Modul zuständig. Der BSS ist seit Delphi 3 für seine Instabilitäten berüchtigt.

    Wenn der BSS verwendet wird, was passiert, wenn sich der Administrator auf dem NT4-Server <b>niemals</b> mehr abmeldet (d.h. während der Laufzeit des BSS immer als interaktiver Benutzer angemeldet bleibt)

    Comment


    • #3
      Hallo,

      der Zugriff erfolgt über DCOM.

      Gibt es Probleme mit der MIDAS.DLL bzw. STDVCL40.DLL?<br>
      Ich habe festgestellt, dass noch die Dateien aus der Delphi Version 4.0<br> installiert sind.<br>
      Macht es Sinn diese gegen die Version 5.0 bzw. 6.0 auszutauschen?

      Vorerst Danke.<br> Hors

      Comment


      • #4
        Hallo,

        &gt;Macht es Sinn diese gegen die Version 5.0 bzw. 6.0 auszutauschen?

        generell sollte man an dieser Stelle synchron bleiben. In "richtigen" Projekten setze ich jedoch kein MIDAS ein, sondern hole mir direkt über DCOM ein Recordset (ADO im ltBatchOptimistic-Modus). Ich kann also mangels eigener praktischer Erfahrung nicht sagen, ob das ein generelles MIDAS-Problem ist oder nicht

        Comment


        • #5
          Hallo,

          ich möchte heute noch einmal auf das Problem zurückkommen. <br>
          In der Zwischenzeit habe ich viel herumexperimentiert und hoffe, dass Sie mir doch noch den einen oder anderen Tipp geben können:

          Die DLL’s habe ich aktualisiert. <br>
          Weiterhin konnte ich feststellen, dass die Fehlermeldung direkt aus einer Methode des Interfaces kommt. Ich übergebe eine Variable vom Typ integer und erhalte als Rückgabewert auch einen Integer. <br>
          In dieser Methode werden etliche Tabellen der Datenbank über Querys manipuliert (ändern, löschen und hinzufügen). Ich habe alle möglichen Fehlermeldungen der Querys (OnxxxError) in eine Protokolldatei umgeleitet. Weiterhin habe ich alle ‚Open’ über ‚TRY’ .. ‚EXCEPT’ protokolliert. <br>
          Es werden keine Fehler angezeigt ! <br>
          Anhand der verarbeiteten Daten kann ich feststellen, dass das Programm immer an einer anderen Stelle abbricht. <br>
          Die Verbindung des Clients zum Server bleibt nach der Fehlermeldung bestehen. Beim Beenden wird der Client ordnungsgemäß abgemeldet.

          Noch etwas zu ‚„richtigen“ Projekten’: <br>
          Ich habe dieses recht umfangreiche Projekt vor ca. 3 Jahren begonnen. <br>
          Damals wurde ‚MIDAS’ von Ihnen noch nicht verteufelt. Schon gut, die Zeit ist weitergegangen. Heute gibt es sicher bessere Lösungen. <br>
          Welchen Vorschlag könnten Sie mir mach, das gesamte Projekt -ohne es kpl. neu zu schreiben- auf eine aktuellere Basis zu stellen? <br>
          Die Datenbank (Interbase) möchte ich beibehalten. Im Projekt gibt es etwa 100 StoredProcs.<br>
          ADO und Interbase? <br>
          IBX und Interbase? Gibt es Beispiele für mehrschichtige Anwendungen? <br>
          Delphi 6 und Interbase. Lohnt sich für diese Anwendungen ein Upgrade?

          Ich hoffe Sie können mir zu dieser <B>veralteten Technik</B> doch noch einen Tipp geben.

          Vielen Dank im Voraus.

          Gruß <br> Hors

          Comment


          • #6
            Hallo,

            &gt;Ich hoffe Sie können mir zu dieser veralteten Technik doch noch einen Tipp geben.

            nein - <b>veraltet</b> ist MIDAS nicht, das Three-tier-Prinzip ist auch heute nocht topaktuell (.NET basiert vollständig darauf). Das Problem mit MIDAS liegt nur schlicht und einfach darin, dass es <b>immer noch nicht funktioniert</b> :-(

            Wenn man sich die Entwicklung anschaut (MIDAS 1, MIDAS 2 und MIDAS 3) gab es jedesmal Inkompatibilitäten und auch die Bug-Liste wurde nur größer. Bei MIDAS 1 hatte ich noch die Hoffnung, das die Einschränkungen dieser "Version 1-Software" im nächsten Upgrade beseitigt werden. Als dann MIDAS 2 erschient, wich die Euphorie der Ernüchterung, um mit MIDAS 3 überganglos ins Entsetzen zu wechseln (so dass ich keine positiven MIDAS-Artikel mehr geschrieben habe). Bis heute hat Borland das Versprechen <b>nicht</b> eingelöst, als Referenzprojekt ein "echtes" (umfangsreiches) Beispielprojekt zu veröffentlichen (die Projekte im Demos-Verzeichnis sind ja wohl ein Witz).

            Es fällt auch auf, dass es bis heute nur ein einziges Buch zum Thema MIDAS gibt (das aber Kylix betrachtet und daher nur mit Minimal-Projekten a la dbExpress hantiert). Weil es diese jahrelangen Probleme mit MIDAS, dem Borland Socket Server bzw. der Borland-ISAPI-DLL für die TWebConnection-Anbindung gibt, riskiere ich diesen Ärger auch nicht mehr (Mit "richtige Anwendungen" meine ich Projekte, bei denen das Ganze unter Last stabil laufen soll. Bei reinen Prototyp-Projekten, die einem potentiellen Kunden das Prinzip sowie die Optionen verdeutlichen sollen, treten diese Problem in der Regel ja nicht auf).

            &gt;...doch noch einen Tipp geben.

            Mit dem Zugriff über DCOM sind 2 von 3 Problemstellen (BSS + ISAPI) aus dem Spiel. Was passiert, wenn TDCOMConnection entsorgt wird und der Client direkt auf die <B>CoXYZ.CreateRemote</b>-Hilfsfunktion (class function) der importierten Typbiblithek des MIDAS-Servers zugreift und somit direkt über die frühe Bindung direkt mit dem Dual Interface hantiert?

            Ist der MIDAS-Server eine EXE? Wenn ja, welche Class Factory (TAutoObjectFactory oder TComponentFactory) wird verwendet?

            Wieviele CPUs stecken im Server?

            &gt;Delphi 6 und Interbase. Lohnt sich für diese Anwendungen ein Upgrade?

            Mit Delphi 6 würde das Projekt vom Regen in die Traufe kommen. In der letzten Februarwoche dieses Jahres hat Borland das UpdatePack#2 für Delphi 6 (engl.) veröffentlich - und dabei einige neue Bomben platziert. Das UpdatePack#2 für die deutsche Delphi 6-Version steht erst seit <b>Heute</b> zur Verfügung (so dass ich nichts dazu sagen kann). Durch die Anpassungsarbeiten für Kylix wurden Uralt-Teile von Delphi so weit zurückgebaut (mit dem Verzicht auf das Win32-API musste Borland viele Teile getreu dem Prinzip des "Kleinsten gemeinsamen Nenners von Windows und Linux" vollständig neu schreiben), das es fraglich ist, ob überhaupt ein UpdatePack noch helfen kann :-(


            &#10

            Comment


            • #7
              Hallo,

              herzlichen Dank für die schnelle und umfangreiche Antwort. <br>

              Zunächst die Antwort auf Ihre Fragen: <br>
              Der MIDAS-Server ist eine EXE mit tComponentFactory (.....ciMultiInstance, tmApartment). <br>
              Der Server hat nur eine CPU (NT 4.0 SP 6). Als Client habe ich von W95 bis W2k alles getestet. Kein Unterschied.

              Zur frühen Bindung: <br>
              Ich habe die TLB des ‚TRemoteDataModule’ nach Delphi importiert. Beim einfügen der neuen Komponente auf eine Form meldet der Compiler einen unbekannten Bezeichner obwohl die TLB in der Uses-Anweisung eingetragen ist und das Object dort auch existiert? Ist es überhaupt möglich auf diese Art auf ‚TRemoteDataModule’ Methoden zuzugreifen, oder muss ich hier ein ‚TAutoObject’ neu schreiben? Da ich hier auch viele ‚TProvider’ einsetze (Browsen von Datenmengen, datensensitive Felder usw.) möchte ich die anderen MIDAS-Möglichkeiten schon nutzen. <br>
              Ich sollte noch anmerken, das in meinem Objekt ca. 20 MIDAS-Server und ca. 60 Cleint-Programme laufen. Alle nach dem gleichen Strickmuster und ohne jedes Problem. Aus vielen Servern starte ich zum Drucken viele Autoobjekte um mit Quickreport zu drucken. Das läuft alles seit ca. 1 Jahr ohne Störungen. Das geschilderte Problem tritt nur in einem Server auf und erst seit wenigen Monaten. Dieser Server ist allerdings sehr umfangreich. Und die geschilderten Methoden(2), die den Ärger machen, sind die größten. (evtl. Stack?)

              Gruß <br>
              Hors

              Comment


              • #8
                Hallo,

                &gt;Der Server hat nur eine CPU.

                Das ist wieder eine Problemstelle weniger.

                &gt;nur in einem Server auf und erst seit wenigen Monaten

                Wie lange dauert die Ausführung der aufgerufenen Interface-Methode und wie viele Daten (Bytes) werden zwischen Client und Server transportiert

                Comment


                • #9
                  Hallo,

                  das Problem ist unabhängig von der Ausführungszeit.<br>
                  Anhand der veränderten Daten kann ich erkennen, dass teilweise nach dem ersten Verändern eines Datensatzes der Vorgang abgebrochen wird. <br> Es kommt aber auch vor, dass der gesamte Ablauf mehr als 1 Minute dauert und einwandfrei läuft. <br>
                  Hier werden letztlich Rechnungen bzw. Lieferscheine zum Drucken vorbereitet. Der Fehler tritt sowohl beim Bearbeiten eines einzelnen Beleges auf und arbeitet beim nächstenmal so ca. 50 -100 Scheine in einem Durchgang ohne Fehler ab.<br>
                  Es wird nur eine Variable (Integer) in die Methode übergeben. Als Rückgabewert erhalte ich auch nur einen Integerwert.<br>
                  Inzwischen habe ich mich entschlossen, die beiden Methoden in ein Automatisierungsobjekt auszulagern. Hierzu eine Frage:<br>
                  Soll ich in 'TAutoObjectFactory.Create' mit ciMultiInstance oder ciSingleInstance initialisieren?

                  Gruß<br> Hors

                  Comment


                  • #10
                    Hallo,

                    wenn die Zeitdauer und das Datenvolumen egal ist, gehe ich davon aus, dass sich einer der Bugs bemerkbar macht. Mit dem Einsatz von TComponentFactory spaltet die VCL für jeden Client einen neuen Thread im MIDAS-Server ab, wobei dieser Teil leider etwas haarig ist (zum Beispiel hat Borland auf seiner Community-Webseite erst gerade ein öffentliches Beta-Programm für den Bug-Fix des TMultiReadExclusiveWriteSynchronizer gestartet). "Normalerweise" würde ein Three-tier-Anwendung aus verschiedenen DLLs bestehen, die als COM+ Objekte in eine COM+ Anwendung installiert werden. Da es keine EXE gibt, gibt es auch keine TComponentFactory, so dass das eigene Modul niemals selbst Threads abspaltet (denn das ist die Aufgabe vom MTS/COM+).

                    &gt;Soll ich in 'TAutoObjectFactory.Create' mit ciMultiInstance oder ciSingleInstance initialisieren?

                    Das hängt davon ab, mit wieviel RAM der Server ausgestattet ist und wieviele Benutzer gleichzeitig diese Funktion aufrufen werden. Da es bisher Probleme gab, würde ich zuerst auf Nummer Sicher gehen und zu ciSingleInstance greifen. Dies kann ja später jederzeit durch Austauschen der Konstante geändert werden

                    Comment


                    • #11
                      Hallo,

                      das ging aber schnell. Herzlichen Dank.

                      Ich werde Ihnen in den nächsten Tagen über Erfolg bzw. Misserfolg berichten.

                      Gruß<br> Hors

                      Comment


                      • #12
                        Hallo Herr Kosch

                        wie versprochen melde ich mich heute noch einmal um Ihnen mitzuteilen, dass die Anwendung ohne MIDAS einwandfrei läuft. Auch als MultiInstance. Noch einmal herzlichen Dank für diesen Tipp.

                        Erlauben Sie mir in diesem Zusammenhang noch ein Frage:<br>
                        Die Server laufen als Exe. Zur besseren Übersiche habe ich in die MainForm jeweils eine ListView eingebaut. (hatte ich in einer Demo gesehen)<br>
                        Während meiner Tests jetzt habe ich diese nicht bedient. <br>
                        Nun meine Frage:<br>
                        Ist eine Listview multithreadfähig?

                        Gruß Hors

                        Comment


                        • #13
                          Hallo,

                          &gt;Ist eine Listview multithreadfähig?

                          das Problem ist, dass die VCL nicht Multithreadfähig ist und das Listview in einem TForm-Nachfolger eingebettet ist, so dass die VCL immer im Spiel ist. Die offizielle Borland-Lösung für dieses Problem besteht im Aufruf der TThread-Methode Synchronize, allerdings hat das Performance-Einbußen für die Nutzfunktion zur Folge. Der Idealzustand sieht daher so aus, dass die Server-Anwendung ohne Benutzeroberfläche auskommt. Wenn das nicht in Frage kommt, würde ich die Informationen über PostMessage-Aufrufe über eine private Windows-Botschaft zum Hauptformular zustellen. In diesem Fall kümmert sich Windows über die Botschaftswarteschlange und die Message Loop automatisch darum, dass sich die Threads nicht in die Quere kommen, wobei es außerdem zu keinen Performance-Verschlechterungen kommt

                          Comment


                          • #14
                            Hallo,

                            habe ich mir gedacht.<br>
                            Ich werde das mit PostMessage testen. <br>
                            Jedoch nach meinem Urlaub. Das ist jetzt nicht so wichtig.<br>
                            Nochmals herzlichen Dank.

                            Gruß Hors

                            Comment


                            • #15
                              Hallo Herr Kosch,

                              noch einmal zurück zu dem alten Thema MIDAS. <BR>
                              Ist MIDAS in der Delphi-Version 7.0 stabiler geworden?<br>
                              Die DLL's haben eine andere Größe.<br>
                              Macht es Sinn die bestehenden Programme von der BDE weg nach IBX oder DBEXPRESS umzustellen? Den Interbase möchte ich eigendlich beibehalten.<br>
                              Oder auf .NET warten?

                              Gruß<br> Horst Esse

                              Comment

                              Working...
                              X