Announcement

Collapse
No announcement yet.

Buch Client/Server Datenbankentwicklung ...

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

  • Buch Client/Server Datenbankentwicklung ...

    Hallo!

    Ich lese gerade Ihr Buch Client/Server Datenbankentwicklung mit Delphi. In Kapitel 7.4.1 "TSession + TDatabase" lese ich, daß für jede Datenbankverbindung eine eigene Instanz der Klasse TSession angelegt werden muß.
    Nun meine Frage:
    Was ist hier genau mit Datenbankverbindung gemeint?
    - Ist der Zugriff mit zwei TTable-Objekten auf ein und die selbe Tabelle schon eine doppelte Datenbankverbindung?
    - Oder ist eine Zugriff auf zwei in unterschiedlichen Verzeichnissen beheimateten Paradox-Tabellen eine doppelte Datenbankverbindung (Unterschiedliche Verzeichnisse = unterschiedliche Datenbanken bei Paradox)?
    - Oder muß es sich um unterschiedliche Datenbanktreiber handeln, z.B. Paradox und Interbase?

    Vielen Dank für jeden Hinweis.

    Thomas Sparenberg

  • #2
    Hallo,

    eine Datenbankverbindung ist bei SQL-Server ein unabhängiger Zugriffsweg, der völlig getrennte Transaktionen sowie parallele Zugriffe auf die Datenbank erlaubt. Auch wenn Paradox keine SQL-Datenbank ist, trifft diese Beschreibung dennoch auch für Paradox zu.

    Mehrere TTable-Instanzen verwenden immer dann eine <b>gemeinsame</b> Datenbankverbindung, wenn sie über den gleichen BDE-Alias beziehungsweise über die gleiche TDatabase-Instanz auf die Datenbank zugreifen. Wird hier eine Transaktion gestartet, sind immer alle aktiven Datenmengen dieser Verbindung beteiligt.

    Bei Paradox ist das Verzeichnis in dem die Tabellen liegen für die BDE eine Datenbank. Somit werden unterschiedliche BDE-Aliase und somit unterschiedliche Datenbankverbindungen benötigt, wenn auf Tabellen aus unterschiedlichen Verzeichnissen zugegriffen wird.

    Man benötigt immer dann eine zusätzliche TSession/TDatabase-Kombination, wenn das eigene Programme mehrere gleichzeitig parallel ablaufende Datenbankzugriffe benötigt. Man kann sich eine Session als einen logischen Ausführungspfad vorstellen, in dem immer nur eine Aktion ausgeführt werden kann. Öffnet man eine zweite Session, kann das eigene Programm zwei Aktionen gleichzeitig ausführen. Ich Beispiel aus dem Buch wird zum Beispiel die SELECT-Abfrage für die Durchschnittswerte etc. aus einem zweiten Thread heraus gestartet, damit der Anwender nicht auf das Ende dieser Abfragen warten muss, sondern gleich weiterarbeiten kann. Da ein zweiter Thread gleichzeitig und parallel zum primären Thread ausgeführt wird, handelt es sich um zwei logische Ausführungspfade, so das auch zwei Sessions (alias zwei Datenbankverbindungen) benötigt werden.
    &#10

    Comment


    • #3
      Danke! Verstanden.

      Thoma

      Comment


      • #4
        An Herrn Kosch,
        In der Zeitschrift der Entwickler 5.2000 schreiben Sie unter Tipps & Tricks - Mengenlehre, dass man das gewünschte Ergebnis mit einem OnCalcFields-Ereignis erhält. Dem ist leider nicht so, denn nach jeder Datensatzbewegung (scrollen) wird weitergezählt. Vielleicht gibt es eine bessere Lösung, denn auch ich suche nach einer derartigen Lösung.

        mfg
        Herman

        Comment


        • #5
          Hallo,

          in meinem Beispiel wurde eine SELECT-Abfrage verwendet, die die Anzahl der Datensätze in der Ergebnismenge so einschränkt, dass alle Datensätze vollständig im TDBGrid angezeigt werden:
          <pre>
          SELECT CustNo, Company, City
          FROM Customer
          WHERE (City > 'Ka' AND City < 'Kg')
          ORDER BY Company
          </pre>
          Und in diesem Fall kann man durch den Bestand "browsen", ohne dass die Ereignisbehandlungsmethode für OnCalcFields erneut ausgelöst wird. Somit bleibt die Nummerierung unbeschädigt.

          Wenn unbegrenzte Datenmengen durchnummeriert werden sollen, würde ich die Daten in eine TClientDataset-Instanz kopieren und dort eine eigene Spalte vorsehen, die beim Umkopieren fortlaufend nummeriert wird. In diesem Fall ist eine "echte" Tabellenspalte vorhanden, so dass OnCalcFields nicht mehr benötigt wird. Anschliessend wird die TDataSource-Instanz auf diese TClientDataset-Instanz umgebogen.

          Das könnte für das o.g. Beispiel so aussehen:
          <pre>
          {
          Zuerst TQuery.SQL ändern um nur die Struktur über "Lokale Daten
          zuweisen" in die TClientDataset-Instanz zu kopieren":

          SELECT CustNo, Company, City
          FROM Customer
          WHERE 1=2
          ORDER BY Company

          Anschliessen im Objektinspektor über die TClientDataset-
          Eigenschaft FieldDefs das neue Feld für die RecNr hinzufügen.
          Ist das erledigt, wird über das TClientDataset-Popupmenü der
          Eintrag "Dataset erstellen ausgewählt". Nun kann TQuery.SQL
          wieder auf die gewünschte Abfrage geändert werden.

          }

          procedure TForm1.ButtonQueryOpenClick(Sender: TObject);
          var
          iRecNo : Integer;
          begin
          Query1.Active := False;
          Query1.Active := True;
          ClientDataSet1.Active := True;
          iRecNo := 1;
          with Query1 do
          while not EOF do
          begin
          ClientDataSet1.Insert;
          ClientDataSet1RecNo.Value := iRecNo;
          ClientDataSet1City.Value := Query1City.Value;
          ClientDataSet1Company.Value := Query1Company.Value;
          ClientDataSet1CustNo.Value := Query1CustNo.Value;
          Inc(iRecNo);
          Next;
          end;
          Query1.Active := False;
          DataSource1.DataSet := ClientDataSet1;
          end;
          </pre>
          Im Formular sieht das Ganze so aus:
          <pre>
          ...
          object Query1: TQuery
          DatabaseName = 'DBDEMOS'
          SQL.Strings = (
          'SELECT CustNo, Company, City '
          'FROM Customer '
          'ORDER BY Company ')
          Left = 40
          Top = 40
          object Query1CustNo: TFloatField
          FieldName = 'CustNo'
          Origin = 'DBDEMOS."Customer.DB".CustNo'
          end
          object Query1Company: TStringField
          FieldName = 'Company'
          Origin = 'DBDEMOS."Customer.DB".Company'
          Size = 30
          end
          object Query1City: TStringField
          FieldName = 'City'
          Origin = 'DBDEMOS."Customer.DB".City'
          Size = 15
          end
          end
          object DataSource1: TDataSource
          DataSet = Query1
          Left = 80
          Top = 40
          end
          object ClientDataSet1: TClientDataSet
          Aggregates = <>
          FileName = 'C:\Temp\Data.cds'
          FieldDefs = <
          item
          Name = 'CustNo'
          DataType = ftFloat
          end
          item
          Name = 'Company'
          DataType = ftString
          Size = 30
          end
          item
          Name = 'City'
          DataType = ftString
          Size = 15
          end
          item
          Name = 'RecNo'
          DataType = ftInteger
          end>
          IndexDefs = <>
          Params = <>
          StoreDefs = True
          Left = 128
          Top = 40
          object ClientDataSet1CustNo: TFloatField
          FieldName = 'CustNo'
          end
          object ClientDataSet1Company: TStringField
          FieldName = 'Company'
          Size = 30
          end
          object ClientDataSet1City: TStringField
          FieldName = 'City'
          Size = 15
          end
          object ClientDataSet1RecNo: TIntegerField
          FieldName = 'RecNo'
          end
          end
          </pre>

          &#10

          Comment


          • #6
            Vielen Dan

            Comment

            Working...
            X