Announcement

Collapse
No announcement yet.

CreateDataset in Delphi 2007

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

  • CreateDataset in Delphi 2007

    Hallo zusammen, Hallo herr Kosch,

    ich habe ein rießiges Problem. Ich habe eine Routine, welche das CreateDataset von TAdoDataset verwendet. Kann es sein dass das unter Delphi 2007 nicht mehr funktioniert. Bekomme immer eine AV.


    Bräuchte dringend Hilfe.


    mfg

    Astner Klaus

  • #2
    Bisl Code wäre hilfreich.

    Comment


    • #3
      Ochso, sorry

      function TdmX4Datamodule.X4CopyDataset(Source,
      Destination: TBetterAdoDataset): Boolean;
      var
      i: Integer;
      ID: Variant;
      aFieldName: string;
      begin
      try
      // Schritt 1: Feldstruktur kopieren
      if Source.RecordCount > 0 then
      begin
      ID := Source.Fields[0].Value;
      aFieldName := Source.Fields[0].FieldName;
      end;
      Source.DisableControls;
      Destination.DisableControls;
      try
      with Destination do
      begin
      FieldDefs.Clear;
      for i := 0 to Source.FieldDefs.Count - 1 do
      begin
      with FieldDefs.AddFieldDef do
      begin
      Name := Source.FieldDefs[i].Name;
      DisplayName :=
      Source.FieldDefs[i].DisplayName;
      Attributes :=
      Source.FieldDefs[i].Attributes;
      DataType :=
      Source.FieldDefs[i].DataType;
      Precision :=
      Source.FieldDefs[i].Precision;
      Required :=
      Source.FieldDefs[i].Required;
      Size :=
      Source.FieldDefs[i].Size;
      end;
      end;
      // Schritt 2: RecordSet anlegen
      Close;
      CreateDataSet; // Genau hier kommt die AV
      end;
      // Schritt 2,5: Displaylabel Übertragen
      for i := 0 to Source.FieldCount - 1 do
      begin
      if Source.Fields[i] is TNumericField then
      (Destination.FieldByName(Source.Fields[i].FieldName) as
      TNumericField).DisplayFormat :=
      (Source.Fields[i] as TNumericField).DisplayFormat;
      Destination.FieldByName(Source.Fields[i].FieldName).DisplayLabel :=
      Source.Fields[i].DisplayLabel;
      end;
      if Source.RecordCount > 0 then
      begin
      // Schritt 3: Daten kopieren
      with Source do
      begin
      First;
      while not Eof do
      begin
      Destination.Append;
      for i := 0 to Source.FieldCount - 1 do
      begin
      if Destination.FindField(Fields[i].FieldName) <> nil then
      begin
      Destination.FieldByName(Fields[i].FieldName).Value :=
      Fields[i].Value;
      end;
      end;
      Destination.CheckBrowseMode;
      Next;
      end;
      end;
      // Schritt 4: Kopierte Daten anzeigen
      Destination.Active := True;
      end;
      finally
      Source.EnableControls;
      Destination.EnableControls;
      end;
      Source.Locate(aFieldName, ID, []);
      Result := True;
      except
      on e: exception do
      begin
      result := False;
      MessageDlg(e.message + #13 + #10 + '(Routine: X4CopyDataset)',
      mtError, [mbOK], 0);
      end;
      end;
      end;

      Comment


      • #4
        Und wo wird hier jetzt (wie im ersten Post geschrieben) ein TAdoDataset verwendet? Ich sehe das du hier die TBetterAdoDataset verwendest.

        Evtl. kann ja jemand mehr Hilfe geben der diese Komponenten verwendet. Oder es wäre sinnvoller auf die "normalen" TAdoDataset zu wechseln da diese auch in den letzten Jahren gepflegt wurden (was vermutlich bei deiner Version seid einigen Jahren nicht mehr der Fall ist. Für einen Test um zu sehen ob es damit auch Probleme gibt wäre das sinnvoll.

        Comment


        • #5
          Hallo!

          @Klaus
          Lass das Close in der Zeile davor weg!

          @Bernhard
          Ist das amtlich? TAdodataset wurde gepflegt? Hat das Ding jetzt endlich die gleichen Funktionen wie das betterAdoDataset?

          BYE BERND

          Comment


          • #6
            Originally posted by Bernd Schulz View Post
            @Bernhard
            Ist das amtlich? TAdodataset wurde gepflegt? Hat das Ding jetzt endlich die gleichen Funktionen wie das betterAdoDataset?
            Es wurden jedenfalls mit D6/7/2005/... fixes eingebaut z.B. für fehler bei Verwendung von nvarchars/ntext. Aber da ich mittlerweile weder das eine noch das andere verwende sondern direkt mit den ADO-Interfaces arbeite kann ich nicht sagen wie der Funktionsvergleich ausfällt.

            Comment


            • #7
              @Bernhard

              Es ist etwas komplizierter als du meinst. Wir verwenden das folgendermaßen.

              TAdoDataset
              VGLib2 mit dem VGDataset
              und BetterAdodataset.

              Spricht.

              unser BetterAdoDataset wird abgeleitet von vg2AdoDataset, welches wiederum von TAdoDataset abgeleitet wurde. Wenn also sachen gepflegt wurden, dann müssten wir sie eigentlich auch bekommen haben.

              @BERND
              Das mit dem Close probiere ich. Danke.

              GRÜSSE

              Klaus

              Comment


              • #8
                Hallo Bernd

                das mit dem Close funktioniert leider nicht.


                mfg

                Klaus

                Comment


                • #9
                  Hallo!
                  Code:
                  var
                  	help1, help2 : tbetteradodataset;
                  begin
                  	systemstartup;
                  
                  	help1 := tbetteradodataset.create(nil);
                  	help2 := tbetteradodataset.create(nil);
                  
                  	help1.recordset := adodb._recordset(GetDatabyStatement ( 'select top 10 * from adressen' ));
                  	X4CopyDataset ( help1, help2 );
                  	MessageDlg( pchar( inttostr ( help1.recordcount) + #13 +
                  		inttostr ( help2.recordcount)
                  		), mtInformation, [mbOK], 0);
                  Ich hab mal ein Minimalbeispiel aufgebaut.

                  Systemstartup ist von uns.
                  GetDataByStatement macht genau das, was der Name sagt.

                  Ich hab das Close dringelassen und es klappt. Auch ohne Close funktioniert Deine Funktion einwandfrei.

                  Der Fehler kann dann eigentlich nur mit den Daten im Recordset in Zusammenhang stehen...

                  BYE BERND

                  Comment


                  • #10
                    Hallo Bernd,

                    danke für das Beispiel. Ich habe es allerdings inzwischen so umgebaut, dass das Destionation-Dataset ein TAdoDataset ist. Damit geht es soweit. Bin zwar nicht ganz so zufrieden damit, aber es geht.

                    Arbeitest du mit dem BetterAdoDataset in Delphi 2007 ? Hast du da etwa eine neuere Version ? Ich verwende Version 4.04. Habe aber seit der Umstellung so einige gravierende Probleme in meiner bestehenden Anwendung, in welche ca. 1500 - 1700 TBetterAdoDatasets vorkommen.

                    Ich habe sonst nirgends mehr eine neuere Version gefunden.

                    Ich kann mit die Fehler eigentlich nicht erklären. Aber in bestimmten Fällen, weiss aber nicht genau was dort anders wäre also sonst, bekomme ich immer AV'S.

                    Vielleicht hast du ja was aktuelleres ?

                    Grüsse und nochmals danke

                    Klaus

                    Comment


                    • #11
                      Hallo!

                      Nein ich hab auch "nur" die 4.04
                      Nein wir arbeiten mit Delphi 5

                      Wir haben sporadisch Probleme, wenn im Dataset Nachschlagefelder sind.
                      Aber ansonsten sieht unsere "Copy" Funktion wie Deine aus und die tuts...

                      BYE BERND

                      Comment

                      Working...
                      X