Announcement

Collapse
No announcement yet.

CursorLocation / CursorType

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

  • CursorLocation / CursorType

    Hallo,
    nachdem ich mir im aktuellen Magazin "Der Entwickler" Ausgabe 01/2002
    den Artikel über ADO und Cursor durchgelesen habe weiß ich nun genauso viel oder eher wenig wie vorher.
    Ich verwende : D5 C/S, Access 97, ADO.
    Provider : Microsoft Jet OLEDB 4.0

    Bei einer ganz einfachen Testapplikation habe ich die Einstellungen
    CursorLocation = clUseServer
    CursorType = (alle durchprobiert)

    mit dem Ergebnis das das es nicht funktioniert (Fehlermeldung: Die von der Anwendung angeforderte Operation wird vom Provider nicht unterstützt.) wenn MasterDetailverbindungen zur Entwurfzeit oder Laufzeit gesetzt werden.

    Leider konnte ich diesbezüglich keinerlei Informationen im Artikel finden.
    Weiß eventuell jemand eine Antwort auf die Frage : Warum die MasterDetailverbindungen an dieser stelle Probleme bereiten ?

    Bei Verwendung von CursorLocation : clUseClient läuft es problemlos.

    Viele Grüße
    Walter

  • #2
    Hallo,

    ich kann diesen Effekt nicht reproduzieren. Bei mir arbeiten unter Delphi 5.01 + ADOUpdate2 und Delphi 6.01 beide Wege der Master-/Detail-Kopplung so wie erwartet:

    Fall A) clUseServer + cmdTableDirect + Filter:
    <pre>
    object ADOConnection1: TADOConnection
    ConnectionString =
    'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Database\dbdemos' +
    '.mdb;Persist Security Info=False'
    CursorLocation = clUseServer
    LoginPrompt = False
    Mode = cmShareDenyNone
    Provider = 'Microsoft.Jet.OLEDB.4.0'
    Left = 24
    Top = 16
    end
    object ADODataSet1: TADODataSet
    Connection = ADOConnection1
    CursorLocation = clUseServer
    CommandText = 'customer'
    CommandType = cmdTableDirect
    Parameters = <>
    Left = 64
    Top = 16
    object ADODataSet1CustNo: TFloatField
    DisplayWidth = 12
    FieldName = 'CustNo'
    end
    object ADODataSet1Company: TWideStringField
    DisplayWidth = 36
    FieldName = 'Company'
    Size = 30
    end
    end
    object ADODataSet2: TADODataSet
    Connection = ADOConnection1
    CursorLocation = clUseServer
    CommandText = 'orders'
    CommandType = cmdTableDirect
    IndexName = 'CustNo'
    Parameters = <>
    Left = 128
    Top = 16
    end
    </pre>
    <pre>
    procedure TForm2.FormCreate(Sender: TObject);
    begin
    ADOConnection1.Connected := True;
    ADODataSet1.Active := True;
    ADODataSet2.Active := True;
    end;

    procedure TForm2.DataSource1DataChange(Sender: TObject; Field: TField);
    begin
    if ADODataSet2.State = dsBrowse then
    begin
    ADODataSet2.Filtered := False;
    ADODataSet2.Filter := 'CustNo = ' + ADODataSet1CustNo.AsString;
    ADODataSet2.Filtered := True;
    end;
    end;
    </pre>
    Fall B) clUseServer + cmdTableDirect/cmdText + SELECT-Abfrage mit automatischer Anbindung über den Parameter für die Detail-Datenmenge
    <pre>
    object ADODataSet3: TADODataSet
    Active = True
    Connection = ADOConnection1
    CursorLocation = clUseServer
    CommandText = 'customer'
    CommandType = cmdTableDirect
    Parameters = <>
    Left = 96
    Top = 320
    object ADODataSet3CustNo: TFloatField
    FieldName = 'CustNo'
    end
    object ADODataSet3Company: TWideStringField
    FieldName = 'Company'
    Size = 30
    end
    object ADODataSet3City: TWideStringField
    FieldName = 'City'
    Size = 15
    end
    end
    object DataSource3: TDataSource
    DataSet = ADODataSet3
    Left = 128
    Top = 320
    end
    object ADODataSet4: TADODataSet
    Active = True
    Connection = ADOConnection1
    CursorLocation = clUseServer
    CommandText = 'select * from orders where CustNo = :CustNo'
    DataSource = DataSource3
    MasterFields = 'CustNo'
    Parameters = <
    item
    Name = 'CustNo'
    Attributes = [paNullable]
    DataType = ftFloat
    NumericScale = 255
    Precision = 255
    Value = 1221
    end>
    Left = 104
    Top = 504
    end
    </pre&gt

    Comment


    • #3
      Hallo,

      Danke zunächst für Ihre Mühe. Das ADOUpdate2 habe ich bisher noch
      nicht durchgeführt werde ich aber noch nachholen. Ich werde dann kurz
      eine Info posten ob es daran lag.

      Vielen Dank nochmals !
      Walte

      Comment


      • #4
        Hallo Herr Kosch,

        ich habe das Beispiel nun nach dem AdoUpdate2 noch einmal konstruiert und bekomme nun eine andere Fehlermeldung:

        "Der aktuelle Provider unterstützt nicht die erforderliche Schnittstelle für die Sortier und Filterfunktion."

        Den Inhalt meines ConnectionString verstehe ich allerdings überhaupt nicht. Zum erstellen nutze ich den ConnectionString Dialog.

        Vielleicht haben Sie ja noch einen Tip für mich was da nicht stimmt.
        Vielen Dank und freundliche Grüße
        Walter

        object ADOConnection1: TADOConnection
        Connected = True
        ConnectionString =
        'Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data ' +
        'Source=D:\Delphi-5\Borland Shared\Data\dbdemos.mdb;Mode=Share De' +
        'ny None;Extended Properties="";Jet OLEDB:System database="";Jet ' +
        'OLEDB:Registry Path="";Jet OLEDBatabase Password="";Jet OLEDB:' +
        'Engine Type=5;Jet OLEDBatabase Locking Mode=1;Jet OLEDB:Global' +
        'Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLE' +
        'DB:New Database Password="";Jet OLEDB:Create System Database=Fal' +
        'se;Jet OLEDB:Encrypt Database=False;Jet OLEDBon'#39't Copy Locale'+
        'on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;' +
        'Jet OLEDB:SFP=False'

        CursorLocation = clUseServer
        LoginPrompt = False
        Mode = cmShareDenyNone
        Provider = 'Microsoft.Jet.OLEDB.4.0'
        Left = 12
        Top = 48
        end
        object ADODataSet1: TADODataSet
        Active = True
        Connection = ADOConnection1
        CursorLocation = clUseServer
        CommandText = 'customer'
        CommandType = cmdTableDirect
        Parameters = <>
        Left = 52
        Top = 108
        object ADODataSet1CustNo: TFloatField
        FieldName = 'CustNo'
        end
        object ADODataSet1Company: TWideStringField
        FieldName = 'Company'
        Size = 30
        end
        end
        object ADODataSet2: TADODataSet
        Active = True
        Connection = ADOConnection1
        CursorLocation = clUseServer
        Filtered = True
        CommandText = 'orders'
        CommandType = cmdTableDirect
        IndexName = 'CustNo'
        IndexFieldNames = 'CustNo' // Wird jedesmal automatisch eingefügt
        Parameters = <>
        Left = 52
        Top = 280
        en

        Comment


        • #5
          Hallo nochmals,

          entschuldigung für die nicht vorhanden Formatierung. Ich werde mir gleich als erstes morgen die Hilfe für das Forum durchlesen.

          Gruß
          Walte

          Comment


          • #6
            Hallo,

            &gt;Den Inhalt meines ConnectionString verstehe ich allerdings überhaupt nicht. Zum erstellen nutze ich den ConnectionString Dialog.

            in meinem Beispiel ist die TADOConnection-Komponente deaktiviert - der ConnectionString ist dann wesentlich kürzer, da er nur die reinen Verbindungsdaten, aber nicht die aktuellen Zustandsdaten enthält.

            Um nun zu prüfen, warum es in Ihrem Fall nicht funktionert, würde ich folgendes machen: <br>
            1. Welche ADO-Version wird verwendet? (... ShowMessage(ADOConnection1.Version)...) <br>
            2. Was passiert, wenn die MDB-Datei auf das ACCESS2000-Format geändert wird?<br>
            3. Welche Eigenschaften für die MDB/Jet Engine zeigt das folgende Testprogramm an?

            <pre>
            { ************************************************** **************
            Autor : Andreas Kosch
            Compiler : Delphi 6.0 Enterprise UpdatePack#1
            Betriebssystem : Windows XP Professional
            Erstellt am : 18.11.2001
            Beschreibung : TADODataSet-Methode Support ruft die
            Recordset-Methode Support auf, um zu prüfen,
            welche ADO-Funktionen zur Zeit bei dieser
            Konfiguration zur Verfügung stehen.
            ************************************************** ************** }

            unit SupportsFrm;

            interface

            uses
            Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
            ComCtrls, StdCtrls, Db, ADODB, ExtCtrls;

            type
            TForm1 = class(TForm)
            RadioGroup1: TRadioGroup;
            ADOConnectionACCESS: TADOConnection;
            ADOConnectionSQLSRV: TADOConnection;
            StatusBar1: TStatusBar;
            ListBoxLog: TListBox;
            ADODataSetACCESS: TADODataSet;
            ADODataSetSQLSRV: TADODataSet;
            procedure RadioGroup1Click(Sender: TObject);
            private
            { Private-Deklarationen }
            procedure ShowSupports(ADOCon : TADOConnection;
            ADORec : TADODataSet);
            public
            { Public-Deklarationen }
            end;

            var
            Form1: TForm1;

            implementation

            {$R *.DFM}

            uses ADOInt;

            procedure TForm1.RadioGroup1Click(Sender: TObject);
            begin
            ListBoxLog.Items.Clear;
            ListBoxLog.Sorted := False;
            ADOConnectionACCESS.Connected := False;
            ADOConnectionSQLSRV.Connected := False;
            case RadioGroup1.ItemIndex of
            1 : begin
            ADOConnectionACCESS.Connected := True;
            ADODataSetACCESS.Active := True;
            ShowSupports(ADOConnectionACCESS, ADODataSetACCESS);
            end;
            2 : begin
            ADOConnectionSQLSRV.CursorLocation := clUseClient;
            ADODataSetSQLSRV.CursorLocation := clUseClient;
            ADOConnectionSQLSRV.Connected := True;
            ADODataSetSQLSRV.Active := True;
            ShowSupports(ADOConnectionSQLSRV, ADODataSetSQLSRV);
            end;
            3 : begin
            ADOConnectionSQLSRV.CursorLocation := clUseServer;
            ADODataSetSQLSRV.CursorLocation := clUseServer;
            ADOConnectionSQLSRV.Connected := True;
            ADODataSetSQLSRV.Active := True;
            ShowSupports(ADOConnectionSQLSRV, ADODataSetSQLSRV);
            end;
            end;
            end;

            procedure TForm1.ShowSupports(ADOCon : TADOConnection;
            ADORec : TADODataSet);
            begin
            ListBoxLog.Items.Add('Provider = ' + ADOCon.Provider);
            if ADORec.Supports([coAddNew])then
            ListBoxLog.Items.Add('coAddNew'#9'Ja')
            else
            ListBoxLog.Items.Add('coAddNew'#9'Nein');
            if ADORec.Supports([coApproxPosition])then
            ListBoxLog.Items.Add('coApproxPosition'#9'Ja')
            else
            ListBoxLog.Items.Add('coApproxPosition'#9'Nein');
            if ADORec.Supports([coBookmark])then
            ListBoxLog.Items.Add('coBookmark'#9'Ja')
            else
            ListBoxLog.Items.Add('coBookmark'#9'Nein');
            if ADORec.Supports([coDelete])then
            ListBoxLog.Items.Add('coDelete'#9'Ja')
            else
            ListBoxLog.Items.Add('coDelete'#9'Nein');
            if ADORec.Supports([coFind])then
            ListBoxLog.Items.Add('coFind'#9'Ja')
            else
            ListBoxLog.Items.Add('coFind'#9'Nein');
            if ADORec.Supports([coHoldRecords])then
            ListBoxLog.Items.Add('coHoldRecords'#9'Ja')
            else
            ListBoxLog.Items.Add('coHoldRecords'#9'Nein');
            if ADORec.Supports([coIndex])then
            ListBoxLog.Items.Add('coIndex'#9'Ja')
            else
            ListBoxLog.Items.Add('coIndex'#9'Nein');
            if ADORec.Supports([coMovePrevious])then
            ListBoxLog.Items.Add('coMovePrevious'#9'Ja')
            else
            ListBoxLog.Items.Add('coMovePrevious'#9'Nein');
            if ADORec.Supports([coNotify])then
            ListBoxLog.Items.Add('coNotify'#9'Ja')
            else
            ListBoxLog.Items.Add('coNotify'#9'Nein');
            if ADORec.Supports([coResync])then
            ListBoxLog.Items.Add('coResync'#9'Ja')
            else
            ListBoxLog.Items.Add('coResync'#9'Nein');
            if ADORec.Supports([coSeek])then
            ListBoxLog.Items.Add('coSeek'#9'Ja')
            else
            ListBoxLog.Items.Add('coSeek'#9'Nein');
            if ADORec.Supports([coUpdate])then
            ListBoxLog.Items.Add('coUpdate'#9'Ja')
            else
            ListBoxLog.Items.Add('coUpdate'#9'Nein');
            if ADORec.Supports([coUpdateBatch])then
            ListBoxLog.Items.Add('coUpdateBatch'#9'Ja')
            else
            ListBoxLog.Items.Add('coUpdateBatch'#9'Nein');
            ListBoxLog.Sorted := True;
            end;

            end.
            </pre&gt

            Comment


            • #7
              Hallo Herr Kosch,
              nachdem ich das Testprogramm gestartet habe bekomme ich folgendes Ergebnis:

              <PRE><CODE>

              Version 2.7

              coAddNew Ja
              coApproxPosition Nein
              coBookmark Ja
              coDelete Ja
              coFind Ja
              coHoldRecords Ja
              coIndex Ja
              coMovePrevious Ja
              coNotify Nein
              coResync Nein
              coSeek Ja
              coUpdate Ja
              coUpdateBatch Ja
              Provider = Microsoft.Jet.OLEDB.4.0

              ></PRE></CODE>

              Ich habe mir soeben noch einige Bücher zum Thema ADO besorgt konnt aber bisher noch nichts zu diesem verhalten finden.

              Viele Grüße
              Walte

              Comment


              • #8
                Hallo,

                die folgende Schritt-für-Schritt-Anleitung sollte unter ADO 2.7 und mit der Delphi-Beispieldatenbank erfolgreich sein:

                Schritt 1: TADOConnection konfigurieren

                1. CursorLocation = clUseServer <br>
                2. ConnectionString ... <br>
                3. LoginPrompt = False <br>
                4. Connected = True
                <pre>
                object ADOConnection1: TADOConnection
                Connected = True
                ConnectionString =
                'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\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 = 32
                Top = 24
                end
                </pre>

                Schritt 2: TADODataSet für die Master-Tabelle

                1. CursorLocation = clUseServer <br>
                2. Connection = ADOConnection1 <br>
                3. CommandType = cmdTableDirect <br>
                4. CommandText = customer <br>
                5. Active = True <br>
                6. Feldeditor = persistente TFields anlegen
                <pre>
                object ADODataSet1: TADODataSet
                Active = True
                Connection = ADOConnection1
                CursorLocation = clUseServer
                CommandText = 'customer'
                CommandType = cmdTableDirect
                Parameters = <>
                Left = 72
                Top = 24
                object ADODataSet1CustNo: TFloatField
                FieldName = 'CustNo'
                end
                object ADODataSet1Company: TWideStringField
                FieldName = 'Company'
                Size = 30
                end
                object ADODataSet1City: TWideStringField
                FieldName = 'City'
                Size = 15
                end
                end
                </pre>
                Schritt 3: TADODataSet für die Detail-Tabelle

                1. CursorLocation = clUseServer <br>
                2. Connection = ADOConnection1 <br>
                3. CommandType = cmdText <br>
                4. CommandText = select * from orders where CustNo = :CustNo <br>
                5. Parameters anklicken -> Parameterfenster schliessen <br>
                6. Datasource = DataSource1 <br>
                7. Active = True
                <pre>
                object ADODataSet2: TADODataSet
                Active = True
                Connection = ADOConnection1
                CursorLocation = clUseServer
                CommandText = 'select * from orders where CustNo = :CustNo'
                DataSource = DataSource1
                MasterFields = 'CustNo'
                Parameters = <
                item
                Name = 'CustNo'
                Attributes = [paNullable]
                DataType = ftFloat
                NumericScale = 255
                Precision = 255
                Value = 1221
                end>
                Left = 72
                Top = 208
                end
                </pre>
                P.S: Zur Sicherheit habe ich diese Schritte auf einem Rechner abgearbeitet, auf dem Windows XP (ADO 2.7) und Delphi 6.01 frisch installiert wurde. Die Master-/Detail-Kopplung funktioniert

                Comment


                • #9
                  Hallo,

                  vielen Dank für Ihre Mühe. Ich habe das Beispiel
                  Schritt für Schritt nachvollzogen und ebenfalls
                  einen Rechner frisch mit Windows xp sowie Delphi 5.01
                  + ADO 2.7 vorbereitet.
                  Darauf läuft es so wie es sein soll. Auf den ersten Rechner
                  kopiert, erhalte ich jedoch wieder die alte Fehlermeldung.
                  Da scheint noch ein anderes Problem mit dem Rechner vorzuliegen
                  das sich irgendwie auf ADO auswirkt. BDE funktioniert
                  problemlos diesbezüglich. Das werde ich mir in den nächsten Tage
                  mal etwas genauer ansehn um auch auf diesem Rechner ADO einsetzen zu können.

                  Vielen Dank nochmals für Ihre Hilfe, auch für die in anderen Beiträgen erwähnten Buchtipps die ich gestern beherzigt habe um mich in das Thema zu vertiefen.

                  Ein letzte Frage hätte ich noch zu ADO und den Workshops auf den Entwicklertagen. Von welchem Wissenstand bzgl. ADO gehen sie bei den Workshopteilnehmern aus ? Sollte man sich eventuell vorbereiten ?

                  Viele Grüße
                  Walte

                  Comment


                  • #10
                    Hallo,

                    der Workshop verwendet die Überschrift <i>Einführung in ADO und Delphi</i>, es reicht also aus, wenn grundlegende Kenntnisse über relationale Datenbanken (Begriffe Tabelle, Primär- und Fremdschlüssel etc.) vorhanden sind

                    Comment

                    Working...
                    X