Announcement

Collapse
No announcement yet.

External File Paths

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

  • External File Paths

    In Firebird 1.5 können bekanntlich durch entsprechende Einträge in der Konfigurationsdatei "firebird.conf" externe Dateipfade definiert werden (z.B. ExternalFileAccess = Restrict ExternalTable).

    -----------------------------

    Besteht eine Möglichkeit, sich diese zugelassenen Pfade in IBExpert bzw. über ein Delphi-Programm anzeigen zu lassen, wenn der Zugriff zum Firebird-Server lediglich über die Datei "gds32.dll" besteht (Es besteht also kein direkter Zugang zum Server.) ?

    Grüsse,
    Carsten Schmitz

  • #2
    Nein.

    Schöne Grüße,
    Thoma
    Thomas Steinmaurer

    Firebird Foundation Committee Member
    Upscene Productions - Database Tools for Developers
    Mein Blog

    Comment


    • #3
      Hm, in der Firebird-Konfigurationsdatei ist der oben eingetragene externe Dateipfad definiert, aber ich erhalte in Delphi beim Versuch, eine "InsertInto"-Query zu starten, die folgende Fehlermeldung:
      "Dynamic SQL Error
      SQL error code = -204
      Table unknown
      C:\Programme\Firebird\ExternalTables\Test.csv
      At line 2, column 12"

      -----------------------------------

      Die Datei ist auf jeden Fall vorhanden, da in IBExpert, beim Versuch, die CSV-Datei als Database zu registrieren, die folgende Fehlermeldung erscheint:
      "file ... is not a valid database"

      -----------------------------------

      Die Insert-SQL ist wie folgt definiert:
      "INSERT INTO test (IsoCcy, SF_1, SF_2)
      SELECT * FROM "C:\Programme\Firebird\Firebird_1_5\ExternalTable\ Test.csv"
      -----------------------------------
      Warum wird die externe Tabelle von der "Insert Into"-SQL nicht erkannt ?
      &#10

      Comment


      • #4
        Hi Carsten,
        so weit ich weiss, must du die Tabelle erst anlegen. Ist ja mit IBExpert kein Problem.
        Es gibt auch feste Regeln für External Files. So sind nur Charfelder mit fester Länge erlaubt und die Datei muss dementsprechend auch formatiert sein.
        Es spielt auch eine Rolle, wie du vorgehst.
        Am Besten erst eine Datei erzeugen, in den Pfad legen und dann mit IBExpert die Tabelle definieren. Ich hatte Probleme, als ich es mal anders gemacht habe. (Erst Table angelegt und dann die Datei auf dem Server abgelegt) Wenn die Datei nicht existiert, ist irgendwie die interne Struktur anders.
        Gruß, Fran

        Comment


        • #5
          Hallo Carsten,
          ich befürchte Du hast die Verwendung von den externen Tabellen etwas mißverstanden. Bei der Textdatei muss es sich um Datensätze mit fixer Länge handeln, und die Tabelle muss vorher mit der EXTERNAL FILE Klausel angelegt werden. Beispiel:
          <code>
          CREATE TABLE EXT_TBL EXTERNAL FILE 'file.txt'
          (FNAME CHAR(10),
          LNAME CHAR(20),
          HDATE CHAR(8),
          NEWLINE smallint default 2573);
          COMMIT;
          </code>
          Die Tabelle EXT_TBL kann dann wie eine gewöhnliche Tabelle verwendet werden. Die Länge der CHAR-Felder muss mit der Länge der Felder in der Textdatei übereinstimmen!
          <br>
          Thoma
          Thomas Steinmaurer

          Firebird Foundation Committee Member
          Upscene Productions - Database Tools for Developers
          Mein Blog

          Comment


          • #6
            Hallo,

            Vielen Dank erst einmal für eure Tips. Da habe ich wirklich etwas mißverstanden mit den External Tables. Jetzt bin ich schon mal so weit, daß ich mir die Dateidaten in IBExpert anschauen kann.

            Allerdings hat die Sache noch einen Haken. Die csv-Datei ist wie folgt aufgebaut:
            AED;2;0
            AMD;2;1
            ...

            In IBExpert ist die Anzeige wie folgt:
            ISOCCY SF_1 SF_2
            AED ;2 ;
            0 AM D
            ;2; 0

            ------------------------------------------
            Darf ich die csv-Dateien nicht verwenden oder muß ich noch irgendwie angeben, daß die Dateifelder jeweils durch ein Semikolon getrennt sind ?
            ------------------------------------------

            @Thomas (Posting 4):
            Was genau bewirkt in Deinem Beispiel der Parameter "NewLine default 2573". Gibt der Befehl an, nach wievielen Zeichen die nächste Zeile oder war das nur für deine Beispiel-Datei so ?

            Grüsse,
            Carste

            Comment


            • #7
              Hallo Carsten,
              wie gesagt, es muss sich um eine fixe Datensatzlänge handeln, d.h. ein Trennzeichen kann nicht verwendet werden. Default 2573 ist ein Trick, damit bei einem INSERT automatisch ein CR/LF eingefügt wird, ohne dass man dafür eine UDF verwenden muss.
              <br>
              Thoma
              Thomas Steinmaurer

              Firebird Foundation Committee Member
              Upscene Productions - Database Tools for Developers
              Mein Blog

              Comment


              • #8
                Ok, da habe ich wohl den Begriff "Textdatei mit fixer Datensatzlänge" mißverstanden. Nach meinem bisherigen Verständnis konnte auch eine csv-Datei eine Textdatei mit fixer Datensatzlänge sein, wenn die einzelnen Felder immer die gleiche, fixe Länge aufwiesen.
                -
                Ich werde jetzt erst einmal meine Textdatei ändern lassen und weiter probieren.

                Grüsse,
                Carste

                Comment


                • #9
                  Ich bins wieder. Habe eine neue Textdatei mit fixer Datensatzlänge erhalten. In IBExpert ist die Anzeige leider noch nicht wie gewünscht:
                  ISOCCY SF_1 SF_2 Bemerkung
                  AED 2 0 Richtig
                  ##A M D Anstatt der 2 Rauten werden 2 Vierecke angezeigt
                  20 A Falsch
                  -
                  Warum werden die Sonderzeichen angezeigt und die Daten "verschoben eingelesen"? Wenn ich mir die Datei im Notepad anzeigen lasse, fällt mir nichts ungewöhnliches auf. Sie scheint eine fixe Datensatzlänge zu haben.

                  Grüsse,
                  Carste

                  Comment


                  • #10
                    Hallo,

                    Ich verzweifele langsam an der External Table. Die Textdatei besteht aus ca. 100 Zeilen mit jeweils 5 Zeichen. Die External Table ist wie folgt deklariert:
                    CREATE TABLE test External File 'Test.txt'
                    {IsoCcy Char(3) NOT NULL,
                    SF_1 Char(1) NOT NULL,
                    SF_2 Char(1) NOT NULL};
                    -------------------------------------
                    Der erste Datensatz wird in IBExpert auch richtig angezeigt, aber ab dem 2. Datensatz funktioniert dies nicht mehr.
                    -------------------------------------
                    In der 1. Spalte sind nun auf einmal 2 Sonderzeichen und das 1. Zeichen der Isoccy sichtbar. In der 2. und 3. Spalte ist jeweils das 2. bzw. 3. Zeichen der Isoccy sichtbar.
                    -------------------------------------
                    Woran kann diese falsche Darstellung in IBExpert liegen

                    Comment


                    • #11
                      Hallo,

                      du musst das CRLF (Zeilenende einer Standard-Textdatei) am Ende der Zeile berücksichtigen (das sind deine zwei ominösen Sonderzeichen).
                      Thomas Steinmaurer hat dazu im Create Table Statement das newline eingefügt - das musst du ebenfalls tun, damit die Zeilenendezeichen interpretiert werde

                      Comment


                      • #12
                        Hallo Bruno,

                        Der "Trick" mit dem neuen Feld "NewLine smallint default 2573" führt leider nicht zum gewünschten Erfolg. Die Sonderzeichen sind weiterhin sichtbar.
                        So wie ich Thomas verstanden habe, wird dieser Trick verwendet, um bei einem Insert-Statement automatisch ein CR/LF einzufügen. Bei dem "Create Table ... External File"-Statement handelt es sich lediglich um eine Tabellendefinition.
                        ------------------------------
                        Ich habe gerade festgestellt, daß der Dateiursprung laut Excel "MS-DOS (PC-8)" ist. Hat es vielleicht damit etwas auf sich ? Brauche ich etwa ein reines "Windows (ANSI)"-Format ?

                        Grüsse,
                        Carste

                        Comment


                        • #13
                          Hallo Carsten,
                          wenn es sich um keine vertraulichen Daten handelt, dann schick mir einfach die Textdatei und das verwendete CREATE TABLE Statement an "ts @ iblogmanager.com".
                          <br>
                          Thoma
                          Thomas Steinmaurer

                          Firebird Foundation Committee Member
                          Upscene Productions - Database Tools for Developers
                          Mein Blog

                          Comment


                          • #14
                            Hallo,

                            Thomas hat eine Lösung für das Problem gefunden. Die Smallint- Definition des Feldes "NewLine" stellt bei existierenden Daten ein Problem dar.
                            -------------
                            Wenn man den Datentyp dieses Feldes in Abhängigkeit des Betriebssystems wie folgt ändert, werden die vermeintlichen Sonderzeichen beim Einlesen ignoriert:
                            Windows: NewLine Char(2) NOT NULL
                            Linux/Unix: NewLine Char(1) NOT NULL
                            -------------
                            Vielen Dank an Thomas,
                            Carste

                            Comment

                            Working...
                            X