Announcement

Collapse
No announcement yet.

bitte noch einmal für Dumme

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

  • bitte noch einmal für Dumme

    Also ich hab eine Access 2000 Datenbank.
    Ich verwende ein ADOConnection (clUserServer)Objekt
    Ich verwende ein ADODataset (cmdTableDirect, clUseServer, ctKeyset).

    Soweit so gut ich kann hinzufügen , rauslöschen, geht alles wunderbar.
    So nun möchte ich gerne den Index umstellen (ich hab vorher in Access ein paar definiert) Meiner heißt ImportIDX
    Songs.IndexName := 'ImportIDX';

    Als Fehlermeldung bekomme ich:
    Eine Komponente mit der Bezeichnung ImportIDX existiert bereits.

    Also wenn ich nicht wüßte das mir das Herr Kosch beigebracht hat wie man das richtig macht mit dem Seek dann würde ich an meinem Verstande zweifeln.

    Vielleicht weiss einer von Euch Rat.

    LG
    Peter

  • #2
    ganz lustig ist das er diese Fehlermeldung auch dann bringt wenn ich einen anderen index auswähle. Nur wenn ich den Index lösche kommt die Fehlermeldung nicht. Sobald ich aber einen neuen Index anlege, wird der in der Fehlermeldung angeführt egal welchen Index ich verwende.

    Irgendeine Idee???

    Pete

    Comment


    • #3
      Hallo,

      >Irgendeine Idee???

      wenn die Fehlermeldung "Eine Komponente mit der Bezeichnung xyz existiert bereits" auch dann erscheint, wenn verschiedene Index-Namen durchprobiert werden, kann es sich nicht um eine Bezeichner-Kollision handeln. In diesem Fall gehe ich davon aus, dass der VCL-Überbau ADO Express nicht mehr synchron mit den nativen ADO-Objekten läuft. Diese Fehlermeldung ist mir nur im Zusammenhang mit Delphi 5 <b>ohne</b> installiertes ADO Express-Update 2 bekannt. Mit welcher Delphi-Version wird gearbeitet und welche Patches (offizielle und inoffizielle) sind drin

      Comment


      • #4
        Also ich arbeite mit Delphi 5.0 und hab alles Patches incl. dem ADO2 Patch installiert. Und zwar mehrmals auch nach dem letzten Update auf MDAC 2.6. Denn da kam immer die Fehlermeldung EOF und BOF... bei schließen von Tabellen.

        Welceh inoffiziellen gibts denn? Hab natürlich nur die von der Borland Hompage installiert.

        mfg
        Peter A. Smoli

        Comment


        • #5
          Hallo,

          das ADO Express-Update 2 für Delphi 5.01 reicht aus, der Grund für die Probleme wird im Programm liegen. Wie sieht ein kurzes Beispiel im Source-Code aus, mit dem dieser Effekt über die Delphi-Beispieldatenbank dbdemos.mdb jederzeit reproduziert werden kann

          Comment


          • #6
            Ja ich hab leider keine dbdemos in meiner Installtion und auf der Delphi CD.

            Alsoe schick ich mal den Code wo das problem auftritt:

            <PRE>
            procedure TApplMainFrm.BttnImportClick(Sender: TObject);
            var FileListe: TStrings;
            Mp3Tag: TID3v2;
            verzeichnis: string;
            i: integer;
            begin
            if Form2=nil then Form2:=TForm2.Create(self);
            Form2.ShowModal;
            Songs.Close; <<< neu hinzugefügt dann klappts!!
            Songs.DisableControls;
            Songs.IndexName := 'Datei'; <<< hier tritt der fehler auf
            Songs.Open; <<< neu hinzugefügt damits klappt
            FileListe := TStringList.Create;
            FileListe.AddStrings(Form2.FileListBox1.Items);
            verzeichnis := Form2.FileListBox1.Directory;
            StatusBar1.Panels[2].Text:=verzeichnis;
            FreeandNil(Form2);
            Mp3Tag := TID3v2.Create;

            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

            procedure TApplMainFrm.FormCreate(Sender: TObject);
            begin
            Mp3DB.Properties['Data Source'].Value := ExtractFilepath(Application.ExeName)+'\'+'musikpur .mdb';
            Songs.IndexName := 'Artist';
            Songs.Open;
            end;

            Diese Sequenz hat immer geklappt, wahrscheinich weil die Datenbank erst geöffnet wurde nachdem der Index gesetzt wurde.

            Nun noch die DFM Daten

            object MP3DB: TADOConnection
            ConnectionString =
            'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:\de' +
            'lphi\mP3Tool\Musikpur.mdb;Mode=Share Deny None;Extended Properti' +
            'es="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Je' +
            't OLEDBatabase Password="";Jet OLEDB:Engine Type=5;Jet OLEDB' +
            'atabase Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet O' +
            'LEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password=' +
            '"";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Data' +
            'base=False;Jet OLEDBon'#39't Copy Locale on Compact=False;Jet OLED' +
            'B:Compact Without Replica Repair=False;Jet OLEDB:SFP=False'
            CursorLocation = clUseServer
            LoginPrompt = False
            Mode = cmShareDenyNone
            Provider = 'Microsoft.Jet.OLEDB.4.0'
            Left = 556
            Top = 64
            end
            object Songs: TADODataSet
            Connection = MP3DB
            CursorLocation = clUseServer
            AfterPost = SongsAfterPost
            OnRecordChangeComplete = SongsRecordChangeComplete
            CommandText = 'Titel'
            CommandType = cmdTableDirect
            Parameters = <>
            Left = 668
            Top = 128
            end
            object QExport: TADODataSet
            Connection = MP3DB
            CursorLocation = clUseServer
            CommandText = 'Select * from Titel Order by Artist, Titel'
            Parameters = <>
            Left = 716
            Top = 128
            end

            Was ich nicht verstehe ist das der Index doch jederzeit geändert werden können muß.

            Vielleicht können Sie mir ja die dbdemos.mdb schicken oder sagen wo ich sie bekomme. [email protected]

            Ich hoffe das das alles war das Sie benötigen

            mfg

            Pete

            Comment


            • #7
              Hallo,

              &gt;Vielleicht können Sie mir ja die dbdemos.mdb schicken oder sagen wo ich sie bekomme..

              diese ist normalerweise im Verzeichnis <i>C:\Programme\Gemeinsame Dateien\Borland Shared\Data</i> zu finden.

              Mit dem folgenden Beispielprojekt kann ich zur Laufzeit den Index umschalten, ohne TADODataSet schließen zu müssen:
              <pre>
              unit Unit1;

              interface

              uses
              Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
              Dialogs, StdCtrls, DB, Grids, DBGrids, ADODB;

              type
              TForm1 = class(TForm)
              ADOConnection1: TADOConnection;
              ADODataSet1: TADODataSet;
              DBGrid1: TDBGrid;
              DataSource1: TDataSource;
              Button1: TButton;
              Button2: TButton;
              procedure Button1Click(Sender: TObject);
              procedure Button2Click(Sender: TObject);
              private
              { Private-Deklarationen }
              public
              { Public-Deklarationen }
              end;

              var
              Form1: TForm1;

              implementation

              {$R *.dfm}

              procedure TForm1.Button1Click(Sender: TObject);
              begin
              ADODataSet1.IndexName := 'ByCompany';
              end;

              procedure TForm1.Button2Click(Sender: TObject);
              begin
              ADODataSet1.IndexName := 'PrimaryKey'
              end;

              end.
              </pre>
              DFM-Datei:
              <pre>
              object Form1: TForm1
              Left = 286
              Top = 107
              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
              PixelsPerInch = 96
              TextHeight = 13
              object DBGrid1: TDBGrid
              Left = 16
              Top = 80
              Width = 553
              Height = 120
              DataSource = DataSource1
              TabOrder = 0
              TitleFont.Charset = DEFAULT_CHARSET
              TitleFont.Color = clWindowText
              TitleFont.Height = -11
              TitleFont.Name = 'MS Sans Serif'
              TitleFont.Style = []
              end
              object Button1: TButton
              Left = 144
              Top = 32
              Width = 75
              Height = 25
              Caption = 'Button1'
              TabOrder = 1
              OnClick = Button1Click
              end
              object Button2: TButton
              Left = 232
              Top = 32
              Width = 75
              Height = 25
              Caption = 'Button2'
              TabOrder = 2
              OnClick = Button2Click
              end
              object ADOConnection1: TADOConnection
              Connected = True
              ConnectionString =
              'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Programme\Gemein' +
              'same Dateien\Borland Shared\Data\dbdemos.mdb;Persist Security In' +
              'fo=False'
              CursorLocation = clUseServer
              LoginPrompt = False
              Mode = cmShareDenyNone
              Provider = 'Microsoft.Jet.OLEDB.4.0'
              Left = 16
              Top = 24
              end
              object ADODataSet1: TADODataSet
              Active = True
              Connection = ADOConnection1
              CursorLocation = clUseServer
              CommandText = 'customer'
              CommandType = cmdTableDirect
              Parameters = <>
              Left = 56
              Top = 24
              end
              object DataSource1: TDataSource
              DataSet = ADODataSet1
              Left = 96
              Top = 24
              end
              end
              </pre&gt

              Comment


              • #8
                Hallo,

                Also ich hab vielleicht einen Knopf in den Augen aber mein Code denn ich geschickt habe ist ja völlig ident.

                Also hab ich mich auf den Weg gemacht diese dbdemos zu bekommen.
                und dann hab ich eine einfache Anwendung so wie sie Herr Kosch erstellt, di nur 2 Buttons eine DBGrid und die ADOConnection und die Datasource enthält.

                Das Ergebnis war:
                Gleiches Problem bei meiner Datenbank. Wenn ich abe die DBdemos benutze hab ich das Problem nicht. Also liegt es an der Datenbank.
                aber wo und warum.
                Sie enthält nur die eine Tabelle Titel. und ein paar Index.

                Jetzt weis ich gar nicht mehr wo und wie ich suchen soll.

                mfg

                Pete

                Comment


                • #9
                  Hallo,

                  &gt;Wenn ich abe die DBdemos benutze hab ich das Problem nicht. Also liegt es an der Datenbank.

                  genau das ist der Grund, warum es zur Fehlereingrenzung wichtig ist, immer zuerst die Beispieldatenbanken heranzuziehen. Erst wenn sich dort das Problem jederzeit reproduzieren lässt, kann man die eigene Datenbank als Fehlerquelle ausschließen.

                  &gt;Jetzt weis ich gar nicht mehr wo und wie ich suchen soll.

                  Ich würde zuerst eine völlig neue Datenbank mit sehr einfacher Struktur erzeugen und den Versuch dort wiederholen. Wenn das erfolgreich ist, gibt es nur 2 mögliche Fehlerursachen: <br>
                  1. Die "alte" Datenbank ist intern beschädigt<br>
                  2. Die "alte" Datenbank verwendet eine Struktur, die mit ADO Express kollidier

                  Comment


                  • #10
                    Hallo,

                    Also ich hab eine neue Datenbank angelegt.
                    Wieder nur mit einer Tabelle. Diesmal nicht mit 26 feldern sondern nur mit 8. Hab wieder mehrere Indexe angelegt.

                    Leider hab ich das gleiche Verhalten.
                    Ich benutzte Delphi 5.0 mit allen Servicepatches und AOD Patche 2.
                    Hab MDAC 2.7 installiert.

                    LG
                    Peter A. Smoli

                    Comment


                    • #11
                      Hallo,

                      an Delphi 5 und ADO kann es nicht liegen, denn sonst würde die Beispieldatenbank <i>dbdemos.mdb</i> nicht funktionieren. Es muss also einen Unterschied in der MDB-Datei geben

                      Comment


                      • #12
                        Also alles was ich herausgefunden habe das mit jeder neuen Datenbank passiert die ich anlege.

                        Wie kann man nun herausfinden was an den Datenbanken nicht gleich ist?

                        Datenbanken die ich vor der Umstellung auf MDAC 2.7 erzeugt habe auf den gleichen Rechner zeigen diese Problem nämlich nicht.

                        Und MDAC 2.7 läßt sich leider nicht entfernen.

                        Grüße

                        Peter A. Smoli

                        Comment


                        • #13
                          Hallo,

                          in diesem Fall würde ich folgendes machen:

                          <b>Schritt 1: Über ADOX eine neue MDB mit Primärschlüssel und zusätzlichem Index anlegen</b>
                          <pre>
                          uses ADOX_TLB, Variants;

                          resourcestring
                          cCONNECTSTRING = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=';

                          procedure TFormMain.Button1Click(Sender: TObject);
                          var
                          aCatalog : _Catalog;
                          aTable : _Table;
                          aColumn : _ColumnDisp;
                          aIdx : _Index;
                          sDBPath : String;
                          sDS : String;
                          vColName : OleVariant;
                          begin
                          MemoLog.Lines.Clear;
                          sDBPath := 'C:\TEMP\NEUMDB.MDB';
                          if FileExists(sDBPath) then
                          begin
                          DeleteFile(sDBPath);
                          MemoLog.Lines.Add(Format('Datenbankdatei %s gelöscht',[sDBPath]));
                          end;
                          aCatalog := CoCatalog.Create;
                          MemoLog.Lines.Add('Catalog...');
                          sDS := aCatalog.Create(Format('%s%s',[cCONNECTSTRING, sDBPath]));
                          MemoLog.Lines.Add(sDS);
                          aTable := CoTable.Create;
                          MemoLog.Lines.Add('Table...');
                          aTable.ParentCatalog := aCatalog;
                          aTable.Name := 'Kunden';

                          // Spalte 1 = Primärschlüssel
                          vColName := 'KdnName';
                          aTable.Columns.Append(vColName, adVarWChar, 30);
                          aColumn := aTable.Columns.Item[vColName] as _ColumnDisp;
                          aColumn.Properties['Description'].Value := 'Name des Kunden';
                          MemoLog.Lines.Add('Spalte 1 hinzugefügt...');

                          // Primärschlüssel hinzufügen
                          aTable.Keys.Append('KdnKey', adKeyPrimary, vColName, '', '');
                          MemoLog.Lines.Add('Spalte 1 als Primärschlüssel definiert...');

                          // Spalte 2 = Zeichenfeld, das auch Leer bleiben kann
                          vColName := 'eMail';
                          aTable.Columns.Append(vColName, adVarWChar, 20);
                          aColumn := aTable.Columns.Item[vColName] as _ColumnDisp;
                          aColumn.Properties['Description'].Value := 'eMail-Adresse des Kunden';
                          aColumn.Properties['Jet OLEDB:Allow Zero Length'].Value := True;
                          aColumn.Properties['Default'].Value := '(unbekannt)';
                          MemoLog.Lines.Add('Spalte 2 hinzugefügt...');
                          // Index auf die Spalte 2 legen
                          aIdx := CoIndex.Create;
                          with aIdx do begin
                          Name := 'IdxMail';
                          Columns.Append(aColumn.Name, aColumn.Type_, aColumn.DefinedSize);
                          PrimaryKey := False;
                          Unique := False;
                          end;
                          aTable.Indexes.Append(aIdx, EmptyParam);
                          MemoLog.Lines.Add('Index IdxMail hinzugefügt...');

                          // Spalte 3 = Zeichenfeld mit "Erforderlich = Nein"
                          vColName := 'Telefon';
                          aTable.Columns.Append(vColName, adVarWChar, 15);
                          aColumn := aTable.Columns.Item[vColName] as _ColumnDisp;
                          aColumn.Properties['Description'].Value := 'Telefonnummer des Kunden';
                          aColumn.Properties['Nullable'].Value := True;
                          MemoLog.Lines.Add('Spalte 3 hinzugefügt...');

                          // Tabelle hinzufügen
                          aCatalog.Tables.Append(aTable);
                          MemoLog.Lines.Add('.... Fertig!');
                          end;
                          </pre>
                          <b>Schritt 2: Testprogramm</b>
                          <pre>
                          unit Unit1;

                          interface

                          uses
                          Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
                          Dialogs, StdCtrls, ExtCtrls, DBCtrls, DB, Grids, DBGrids, ADODB;

                          type
                          TForm1 = class(TForm)
                          ADOConnection1: TADOConnection;
                          ADODataSet1: TADODataSet;
                          DBGrid1: TDBGrid;
                          DataSource1: TDataSource;
                          DBNavigator1: TDBNavigator;
                          Button1: TButton;
                          Button2: TButton;
                          procedure Button2Click(Sender: TObject);
                          procedure Button1Click(Sender: TObject);
                          private
                          { Private-Deklarationen }
                          public
                          { Public-Deklarationen }
                          end;

                          var
                          Form1: TForm1;

                          implementation

                          {$R *.dfm}

                          procedure TForm1.Button2Click(Sender: TObject);
                          begin
                          ADODataSet1.IndexName := 'IdxMail';
                          end;

                          procedure TForm1.Button1Click(Sender: TObject);
                          begin
                          ADODataSet1.IndexName := 'KdnKey';
                          end;

                          end.
                          </pre>
                          <Pre>
                          object Form1: TForm1
                          Left = 286
                          Top = 107
                          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
                          PixelsPerInch = 96
                          TextHeight = 13
                          object DBGrid1: TDBGrid
                          Left = 8
                          Top = 96
                          Width = 561
                          Height = 120
                          DataSource = DataSource1
                          TabOrder = 0
                          TitleFont.Charset = DEFAULT_CHARSET
                          TitleFont.Color = clWindowText
                          TitleFont.Height = -11
                          TitleFont.Name = 'MS Sans Serif'
                          TitleFont.Style = []
                          end
                          object DBNavigator1: TDBNavigator
                          Left = 8
                          Top = 64
                          Width = 240
                          Height = 25
                          DataSource = DataSource1
                          TabOrder = 1
                          end
                          object Button1: TButton
                          Left = 128
                          Top = 16
                          Width = 75
                          Height = 25
                          Caption = 'Button1'
                          TabOrder = 2
                          OnClick = Button1Click
                          end
                          object Button2: TButton
                          Left = 208
                          Top = 16
                          Width = 75
                          Height = 25
                          Caption = 'Button2'
                          TabOrder = 3
                          OnClick = Button2Click
                          end
                          object ADOConnection1: TADOConnection
                          Connected = True
                          ConnectionString =
                          'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\TEMP\NEUMDB.MDB;' +
                          'Persist Security Info=False'
                          CursorLocation = clUseServer
                          LoginPrompt = False
                          Mode = cmShareDenyNone
                          Provider = 'Microsoft.Jet.OLEDB.4.0'
                          Left = 8
                          Top = 16
                          end
                          object ADODataSet1: TADODataSet
                          Active = True
                          Connection = ADOConnection1
                          CursorLocation = clUseServer
                          CommandText = 'Kunden'
                          CommandType = cmdTableDirect
                          Parameters = <>
                          Left = 40
                          Top = 16
                          end
                          object DataSource1: TDataSource
                          DataSet = ADODataSet1
                          Left = 72
                          Top = 16
                          end
                          end
                          </pre>
                          Ergebnis: Index kann zur Laufzeit auch unter MDAC 2.7 problemlos umgeschaltet werden

                          Comment

                          Working...
                          X