Announcement

Collapse
No announcement yet.

BDE Fehler $210D

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

  • BDE Fehler $210D

    Wir haben zwei gleichzeitig laufende Anwendungen, die auf eine Paradox DB zugreifen. Seit eine weitere Tabelle in die DB eingefügt wurde, kann die zweite Anwendung nicht mehr gestartet werden. Beim Öffnen der DB erhalte ich den Fehler $210D "shared memory conflict". In der Borland Online Dokumentation erhält man den Hinweis, SHAREDMEMLOCATION zu verändern. Doch nach welchen Kriterien?
    Wir setzen WinNT4 /SP6 ein.
    Schneider Infosystems AG, Schweiz

    http://www.schneider-infosys.ch

  • #2
    Hallo,

    ich würde zuerst die anderen Werte (MEMSIZE, SHAREDMEMSIZE usw.) hochsetzen

    Comment


    • #3
      Ich erhalte bei der Initialisierung der BDE unter folgenden Voraussetzungen ebenfalls den Fehler $210D:

      -Windows 2000; BDE 5.01; Delphi 5
      -eine andere BDE-Anwendung läuft bereits
      -die MFC42.dll wurde geladen (nur bei dieser??)

      Code:
      procedure TForm1.FormCreate(Sender: TObject);
      begin
      FHdl:=LoadLibrary('Mfc42.dll');
      Session.Active:=true;
      end;

      procedure TForm1.FormDestroy(Sender: TObject);
      begin
      if FHdl<>0 then FreeLibrary(FHdl);
      end;

      Versuche mit MEMSIZE,SHAREDMEMSIZE und SHAREDMEMLOCATION brachten keinen Erfolg. Ein Laden der Dll nach dem Aktivieren der Session funktioniert. Unter WinNT4 geht auch alles. Läuft keine andere BDE-Applikation geht auch alles einwandfrei. In der scharfen Applikation wird die Dll implizit durch Einbinden von C++-Dll's geladen, so dass ein dynamisches Laden ausscheidet.

      Soweit zu meinem Problem. Kann mir jemand helfen

      Comment


      • #4
        Hallo,

        was passiert, wenn für <i>SHAREDMEMLOCATION</i> ein Wert im Bereich von <b>1000</b> bis <b>7F00</b> (für NT/2000) eingetragen wird? Schafft das Variieren dieses Wertes Abhilfe

        Comment


        • #5
          Hallo,

          leider nicht. Ich habe nun nicht alle Werte probiert, aber 0x1000,0x300,0x5000,0x7F00. Mit letzterer Adresse erhalte ich schon beim Start meiner ersten BDE-Applikation einen Fehler ($251E). Wo findet man eigentlich Klartext zu den BDE-Fehlercodes? Im übrigen kann ich den Fehler inzwischen auf fünf Win2000 Rechnern der unterschiedlichsten Konfiguration nachvollziehen. Scheint also nicht ursächlich mit der Hardware zusammenzuhängen. Ich konnt auch noch kein einziges Positivergebnis unter Win2000 verbuchen. Bin ratlos

          Comment


          • #6
            Hallo,

            ich habe das Beispielprojekt einmal bei mir ausprobiert:
            <pre>
            unit Unit1;

            interface

            uses
            Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
            DBTables, StdCtrls;

            type
            TForm1 = class(TForm)
            Button1: TButton;
            Session: TSession;
            procedure FormCreate(Sender: TObject);
            procedure FormDestroy(Sender: TObject);
            private
            { Private-Deklarationen }
            public
            { Public-Deklarationen }
            FHdl: THandle;
            end;

            var
            Form1: TForm1;

            implementation

            {$R *.DFM}

            procedure TForm1.FormCreate(Sender: TObject);
            begin
            FHdl := LoadLibrary('Mfc42.dll');
            Session.Active:=true;
            end;

            procedure TForm1.FormDestroy(Sender: TObject);
            begin
            if FHdl<>0 then FreeLibrary(FHdl);
            end;

            end.
            </pre>

            Versuch 1: Fehler beim Programmstart (BDE kann nicht initialisiert werden).

            Version 2: Über die BDE-Verwaltung habe ich in der Spalte SHAREDMEMLOCATION den in der Hilfe für NT empfohlenen Wert <b>0x6BDE0000</b> eingetragen und alle BDE-Anwendungen geschlossen. Wird das Beispielprojekt jetzt gestartet, tritt bei mir (Windows 2000 SP2 und Delphi 6) kein Fehler mehr auf

            Comment


            • #7
              Hallo Herr Kosch,

              diese Adresse ist ja Vorgabe (ich denke auch für Win2000). Eine Änderung auf diese Adresse brachte auch nicht den gewünschten Erfolg. Eine Verringerung von SHAREDMEMORYSIZE auf Minimum (2048) beseitigte das Problem, leider nur für kurze Zeit. Nach einem Systemneustart ging es schon wieder nicht. Allerdings wechselt jetzt die Fehlermeldung von $210D zu $2501. Wo, um Himmels Willen, findet man den zu diesen blöden Fehlercodes Klartext. Man weiß ja gar nicht wo man bei der Fehlersuche ansetzen muß

              Comment


              • #8
                Hallo,

                Borland stellt die BDE-Fehlernummern als TI (Technical Information) in <b>Code Central</b> zur Verfügung: <b>Article #15283: BDE Error listing</b>.

                Hinter der Fehlernummer $2501 verbirgt sich der Text "<i>Insufficient memory for this operation</i>"

                Comment


                • #9
                  Halo,

                  vielen Dank, habe ich gefunden. Außerdem auch BDEerr32.exe, welches den Fehler in deutschem Klartext anzeigt. Nun weiß ich wenigsten, welchen Fehler die BDE produziert hat. Mein Problem aber stellt sich immer komplizierter dar. Inzwischen habe ich schon mehrere Situationen gehabt, dass das Testprogramm mit einer weiteren BDE-Anwendung lief, war zunächst glücklich, doch wenige Sekunden später oder spätestens beim nächsten Systemstart war wieder alles vorbei. Die Fehlermeldungen reichen dabei von ($210D=Konflikt bei dem gemeinsamen Speicherzugrif) über ($2501=Zuwenig Arbeitsspeicher für diese Operation) bis zu ($251E=Es steht nicht genügend gemeinsamer Speicher zur Verfügung). Das sieht alles sehr zufällig und unzuverlässig aus. Ein Prüfung des Testprogramms mit MemProf mit Testanbindung von MFC42.dll,IDAPI32.dll zeigt diverse Fehler angefangen von FindFirst ohne FindClose über RegCloseKey mit ungültigem Handle übergebliebene CriticalSections etc.. Sind diese Teile denn tatsächlich so wacklig, oder hat da mehr das Testprogramm eine Macke? Ich weiß jedenfalls wieder einmal nicht weiter

                  Comment


                  • #10
                    Hallo,

                    ich vermute einmal, dass die Ursache des Problem in der Implementierung des Testprogramms oder in der Paradox-DB (Dateien, Struktur, Zugriffspfad) liegt. Normalerweise gibt es mit der BDE diese Probleme nicht, wobei eine derart pauschale Aussage bei der Vielzahl von Konfigurationsmöglichkeiten nur geringe Aussagekraft hat

                    Comment


                    • #11
                      Hi,

                      ich weiß, solche globalen Fehlermeldungen nützen nichts, aber was soll ich machen. Damit wir über dasselbe reden, das Testprogramm ist so minimal, dass man dort kaum Fehler vermuten würde:

                      unit Unit1;

                      interface

                      uses
                      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
                      StdCtrls;

                      type
                      TForm1 = class(TForm)
                      Button1: TButton;
                      Button2: TButton;
                      procedure Button1Click(Sender: TObject);
                      procedure Button2Click(Sender: TObject);
                      procedure FormDestroy(Sender: TObject);
                      private
                      { Private-Deklarationen }
                      FHdl : THandle;
                      public
                      { Public-Deklarationen }
                      end;

                      var
                      Form1: TForm1;

                      implementation

                      uses dbTables;

                      {$R *.DFM}

                      procedure TForm1.Button1Click(Sender: TObject);
                      begin
                      // Lade die Dll und Starte Session, es sind keinerlei weitere Komponenten im Projekt (keine Datenbanken etc., ganz nackig!!!)
                      if FHdl=0 then
                      begin
                      FHdl:=LoadLibrary('Mfc42.dll'); // geht immer
                      Session.Active:=true; // rumms wenn db-Anwendung läuft!!!
                      end;
                      end;

                      procedure TForm1.Button2Click(Sender: TObject);
                      begin
                      if FHdl<>0 then FreeLibrary(FHdl);
                      FHdl:=0;
                      Session.Active:=false;
                      end;

                      procedure TForm1.FormDestroy(Sender: TObject);
                      begin
                      Button2Click(Self);
                      end;

                      end.

                      Und nun noch die DB-Anwendung (auch äußerst minimal):
                      object Form1: TForm1
                      Left = 245
                      Top = 108
                      Width = 696
                      Height = 480
                      Caption = 'Form1'
                      Color = clBtnFace
                      Font.Charset = DEFAULT_CHARSET
                      Font.Color = clWindowText
                      Font.Height = -11
                      Font.Name = 'MS Sans Serif'
                      Font.Style = []
                      OldCreateOrder = False
                      OnCreate = FormCreate
                      PixelsPerInch = 96
                      TextHeight = 13
                      object DataSource1: TDataSource
                      DataSet = Table1
                      Left = 96
                      Top = 56
                      end
                      object Table1: TTable
                      DatabaseName = 'e:\delphi\testsession'
                      FieldDefs = <
                      item
                      Name = 'Table1Field1'
                      DataType = ftInteger
                      end>
                      StoreDefs = True
                      TableName = 'TestDb.db'
                      Left = 128
                      Top = 56
                      object Table1Table1Field1: TIntegerField
                      FieldName = 'Table1Field1'
                      end
                      end
                      end

                      Im Formcreate des sonst leeren Formulars steht Session.Active:=true;

                      Ablauf: erst die DB-Anwendung starten dann das Testprogramm.

                      Wenn Du noch Lust hast, schicke ich die Sourcen auch gerne noch mal per Mail, aber das hat man auch schnell zusammengeclickt. Die Datenbankstructur besteht aus einem einzigen Integer-Feld.

                      Und nun noch meine (derzeitigen BDE-Einstellungen):

                      [HKEY_LOCAL_MACHINE\SOFTWARE\Borland\Database Engine\Settings\SYSTEM\INIT]
                      "VERSION"="4.0"
                      "LOCAL SHARE"="FALSE"
                      "MINBUFSIZE"="128"
                      "MAXBUFSIZE"="2048"
                      "LANGDRIVER"="ANSIINTL"
                      "MAXFILEHANDLES"="48"
                      "SYSFLAGS"="0"
                      "LOW MEMORY USAGE LIMIT"="32"
                      "AUTO ODBC"="FALSE"
                      "DEFAULT DRIVER"="PARADOX"
                      "MEMSIZE"="16"
                      "SHAREDMEMSIZE"="2048"
                      "SHAREDMEMLOCATION"=""
                      "DATA REPOSITORY"="Sample Data Dictionary"
                      "SQLQRYMODE"=""
                      "MTS POOLING"="FALSE"

                      NetDir für Paradox liegt auf einem Novell-Server und hat alle Rechte. Siehst Du wo mein Fehler liegt (ich hoffe ich bin es, denn sonst wird es mit Abhilfe wohl schwer). Danke

                      Comment


                      • #12
                        Hallo,
                        ich hab auch das Problem mit dem Fehler $210d :

                        Der Fehler tritt erst auf, wenn eine zweite BDE-Application gestartet wird
                        und die erste Application eine Tabelle einmal geoeffnet hat.
                        D.h. auch wenn in der ersten Application die Tabelle geoffnet und wieder
                        geschlossen wird und anschliessend die zweite Application gestartad wird.

                        Zur Fehlersuche hab ich ausser formCreate komplett alles auskommentiert, der
                        Fehler tritt trotzdem wie oben beschrieben auf.

                        Wenn ich versuch die Datenbankobflaeche aus der IDE zu starten erhalte ich
                        die Fehlermeldung :
                        'BDE konnte nicht initialisiert werden : Konflikt bei gemeinsamen
                        Speicherzugriff'

                        Delphi 5.0 Service Pack 6
                        BDE-Version 5.01
                        Datenbanktreiber : Paradox Version 4.0
                        (Nur bei WIN2000 tritt der Fehler auf, bei NT nicht)

                        Danke im Voraus
                        Fran

                        Comment


                        • #13
                          Einige Überlegungen zu den BDE Fehlern 210d und 2051

                          Gemeinsam ist allen betroffenen, daß der Fehler entweder auf NT-basierten Systemen auftaucht. Auf Systemen 95, 98, Me tritt der Fehler üblicherweise nicht auf.

                          Der Parameter SHAREDMEMSIZE, die Adresse des Datenbereiches, den die BDE gemeinsam für verschiedene Applikationen hat Einfluß.
                          - Ist SHAREDMEMSIZE zu gering angegeben erhält man Fehler 2501
                          - Ist sie zu hoch angegeben erhält man 210d

                          Wenn genug SHAREDMEMORY zur Verfügung steht, dann gibt es Größeneinstellungen zwischen den Bereichen von 25011 und 210d.

                          Ob genug SHAREDMEMSIZE zur Verfüguing steht hängt von der Konfiguration des Rechners (Hardwaretreiber scheinen teils den gleichen Speicherbereich zu beanspruchen) und von anderer Software ab (bei der Verwendung von verschiedenen dll´s kommt es ebenfalls zu Problemen). E$ine funktionierende Adresse variiert damit auf unterschiedlichen Systemen.

                          Folge: Es macht nur bedingt Sinn sich neue Adressen zu empfehlen,
                          da Kollegen andere Rechnerkonfigurationen fahren.
                          SCHLIMMER noch: Bei der Distribution von größeren
                          BDE-Anwendungen, kann es zu Problememn bei Kunden kommen,
                          die bei einem selbst nicht auftreten und die derzeit so
                          nicht zu beheben sind.

                          Interessant: Ist einmal eine funktionierende BDE-SHREDMEM-Adresse gefunden, die läuft können Datenbankprogramme mehrfach ohne Probleme gestartet werden.

                          Was fehlt ist derzeit eine automatische BDE-Nachkonfiguration. Dafür sind allerdings mehr Interna über die BDE nötig, mir zumindest bekannt sind. Ich nehme an, daß das Borland-BDE-Team nicht mit der neuen dll-Verwaltung der NT-basierten Systeme zurechtgekommen ist und befüchte, daß für kommerzielle Anwendungen in den beiden Fehlern das "AUS" für die BDE liegt.

                          Ideen (auch optimistische)sind willkommen // Marti

                          Comment

                          Working...
                          X