Announcement

Collapse
No announcement yet.

DBase über ADO

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

  • DBase über ADO

    Hallo zusammen!

    Ich versuche eine DBase - Exportdatei über ADO zu erstellen (damit die BDE nicht installiert werden muß). So klappt dank der Hilfe des Forums ;-) auch alles wunderbar. <BR> Jetzt gibt es nur noch ein (größeres) Problem:<BR> wenn ein gewisses Maximum an Feldern erreicht ist (in meinem Fall 106 - 108) (Hängt vom Feldtyp ab), dann kommt die Fehlermeldung: "Feld wird nicht in Datensatz passen". Dieser Fehler tritt ebenfalls auf, wenn man eine Tabelle mit Alter table erweitern will. Die Datenbankoberfläche erweitert diese Tabelle aber ohne Probleme, und wenn die Tabelle mit Hilfe der BDE erstellt wird, dann scheint es diese Beschränkungen auch nicht zu geben.

    Danke schon mal für die Hilfe.

  • #2
    Hallo,

    es gibt verschiedene mögliche Ursachen für dieses Problem: <br>
    a) Version der Microsoft JET Engine <br>
    b) Version der dBASE-Tabelle <br>
    c) unterschiedliche Vorgabewerte für die Spaltenlänge, wenn im Programm dieser Wert nicht explizit gesetzt wird.

    Wie sieht ein kurzes Beispiel aus, mit dem dieser Effekt jederzeit reproduziert werden kann?

    P.S. In bin die nächste Woche auf der EKON6 und werde daher auf die Antwort nicht sofort reagieren können

    Comment


    • #3
      Hallo Andreas,

      ich habe mal ein kleines Programm geschrieben, mit dem der Fehler nachzuvollziehen ist:
      <PRE>
      <B>procedure</B> TForm1.Button1Click(Sender: TObject);
      <B>var</B> tconn : TADOConnection;
      tqry : TADOQuery;
      tfelder : <B>String</B>;
      i, tAnzahl : Integer;
      <B>begin</B>
      tconn:=TADOConnection.Create(Self);
      <B>if</B> FileExists(Edit1.Text+Edit2.Text+'.dbf') <B>then</B> DeleteFile(Edit1.Text+Edit2.Text+'.dbf');
      <B>with</B> tconn <B>do</B>
      <B>begin</B>
      ConnectionString:='Provider=Microsoft.Jet.OLEDB.4. 0;Data Source='+Edit1.Text+';Extended Properties=dBase 5.0;Persist Security Info=False';
      LoginPrompt:=false;
      Connected:=true;
      <B>end</B>;
      tAnzahl:=StrToIntDef(Edit3.Text,100); //Anzahl der Felder
      tfelder:='';
      <B>for</B> i:=1 <B>to</B> tAnzahl <B>do</B>
      <B>begin</B>
      tfelder:=tfelder+' feld'+IntToStr(i)+' VARCHAR(100),'; //VarCHAR 100 : Damit sind 40 Felder maximal möglich
      <B>end</B>;
      tfelder:=copy(tfelder,1,length(tfelder)-1); //ohne abschließendem Komma
      tqry:=TADOQuery.Create(Self);
      <B>with</B> tqry <B>do</B>
      <B>begin</B>
      Connection:=tconn;
      Close;
      SQL.Clear;
      SQL.Add('CREATE table '+Edit2.Text+' ('+tfelder+')');
      ExecSQL;
      <B>end</B>;
      tqry.Close;
      FreeAndNil(tqry);
      tconn.Connected:=false;
      FreeAndNil(tconn);
      ShowMessage('Tabelle erfolgreich angelegt! Anzahl der Felder (VARCHAR(100)): '+IntToStr(tAnzahl));
      <B>end</B>;
      </PRE>

      In diesem Beispiel mit lauter VARCHAR(100) - Feldern liegt die Grenze bei 40 Feldern!
      Mein System: WinXP Pro., MDAC 2.7

      dBase - Version? Ist das 5.0?

      Mit der Borland - Datenbankoberfläche kann ich die dBase - Tabelle ohne Probleme um ein paar Spalten erweitern.

      Gruß Michae

      Comment


      • #4
        Keiner eine Idee

        Comment


        • #5
          Hallo,

          &gt;Keiner eine Idee?

          jede Datenbank beschränkt die maximale Länge für einen Datensatz. ADO ist der Objektorientierte Überbau für verschiedene Datenbanken, so dass dort die allgemeinen Regeln gelten. Normalerweise ist dies irrelevant, da ein einer normalisierten Datenbank (die Informationen werden auf verschiedene, logisch zusammenhängende Tabellen aufgeteilt) dieses Limit in der Praxis nicht erreicht wird.

          Borland hat in der Technical Information <i>Technical Information Document (TI2751)</i> die folgenden Limits dokumentiert:

          a) 4000 Byte Datensatzgröße (dBASE 4) <br>
          b) 32767 Byte Datensatzgröße (dBASE for Windows)

          Daher ist der eigene Versuch (40 Felder je 100 Byte) der Beweis für die Gültigkeit der Theorie :-

          Comment


          • #6
            Hallo,

            danke für deine Antwort.
            Na ja, wäre zu schön gewesen.

            Fällt dir eine andere Möglichkeit ein, dBase - Datenbanken ohne die BDE zu füllen? (außer hart die Struktur nachbilden)?

            MfG,

            Michae

            Comment


            • #7
              Warum muss es unbedingt dBASE sein? Das native Format für die JET Engine ist MDB (ACCESS-Datenbankformat), man kann nur mit dem frei verfügbaren ADO neue MDB-Datenbanken anlegen und mit Daten füllen (ein installiertes Microsoft ACCESS-Anwendungsprogramm ist <b>nicht</b> notwendig)

              Comment


              • #8
                Hallo Andreas,

                mein Problem besteht darin, daß bisher die BDE verwendet worden ist. D.h. die Kunden haben sich bereits auf eine dBase - Exportdatei eingestellt und machen die verschiedensten Sachen damit (Word, Excel, eigene Internetauftritte, ...). Damit ist das Export - Format dBase eigentlich fest vorgegeben. Außerdem baut unsere "Word-Anbindung" auf dBase auf und erzeugt mit einer dBase - Datenquelle Seriendruck-Dokumente. Der Versuch dBase - Dateien über ADO zu erzeugen resultiert eigentlich nur aus dem Wunsch, die BDE "los" zu werden, da diese sehr anfällig ist bezüglich anderer Software, die irgendwelche BDE-Einstellungen verändert. Die BDE ist im Moment die Fehlerquelle Nr. 1, wenn Kunden Probleme mit der "Word-Anbindung" haben. Die Haupt-Datenbank läuft auf dem SQL-Server bzw. Access.
                Gibt es keine Einstellungen oder Parameter der Jet-Engine, um "dBase for Windows" als Standard - dBase-Datenbank vorzugeben? Oder irgendeine andere Möglichkeit, dBase ohne BDE zu erzeugen?

                MfG

                Michae

                Comment


                • #9
                  Hallo Michael,<BR><BR>doch das geht. Füge in dein Projekt ein ADOConnection Objekt ein, setze die Eigenschaft "LoginPrompt" auf False und erzeuge den ConnectionString wie folgt:<BR>Auf der ersten Seite wählst du den Microsoft Jet 4.0 OLE Provider aus, auf der zweiten Seite gibst du den Verzeichnisnamen ein in dem die DBase Datei erstellt werden soll. Auf der vierten Siete gibt es die Eigenschaft "Extended Properties", die du auf dbase III setzen musst (das ist der Großbuchstabe i). Jetzt kannst du über ADOConnection.Execute('Create Table Test1(Feld1 char(10), Feld2 int'); eine Tabelle erzeugen. Mit den Datentypen musst du mal sehen, ich weiß nicht wie man die numerischen Typen genauer vereinbaren kann (Dezimalstellen usw.), aber das klappt auf jeden Fall!<BR><BR>Ola

                  Comment


                  • #10
                    Hallo Olaf,

                    das dBase - Dateien mit ADO erzeugt werden können, wußte ich, nur mein Problem ist, daß da eine 4000 Byte - Grenze existiert (z.B. 40 VarChar(100) - Felder). Falls die Felder die 4000 - Byte Grenze überschreiten, dann kommt die Fehlermeldung "Feld wird nicht in Datensatz passen". Deshalb suche ich im Moment nach einer anderen Möglichkeit, dBase - Dateien ohne die BDE zu erzeugen, oder ADO "auszutricksen" ;-).

                    MfG

                    Michae

                    Comment


                    • #11
                      Hallo,

                      Microsoft hatte vor einiger Zeit kurzzeitig in ADO eine auf dem Rechner vorgefundene BDE eingebunden, um die hohen Versionsnummern von dBASE und Paradox zu unterstützen. Diese Unterstützung ist meines Wissens nach wieder raus - so dass nur ältere Datenbankversionen von dBASE und Paradox unterstützt werden.

                      Was allerdings immer geht, ist das Einbinden eines ODBC-Treibers (via <i>OLE DB Provider for ODBC Driver</i>). Ich würde mich daher auf die Suche nach einem derartigen Treiber machen, wenn in dBASE Datensätze > 4000 Bytes unbedingt notwendig sind

                      Comment


                      • #12
                        Hallo,

                        Danke für die Antwort, das werde ich dann mal machen...

                        Falls ich es irgendwie geschafft habe, dann poste ich es hier rein.

                        MfG

                        Michae

                        Comment

                        Working...
                        X