Announcement

Collapse
No announcement yet.

Seek klappt einfach nicht!

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

  • Seek klappt einfach nicht!

    Hallo,

    ich habe ein großes Probleme, einen Datensatz in einer Access Tabelle zu finden. Mittels Locate klappt es wunderbar,
    aber mit Seek ist es beim besten Willen nicht möglich. Ich benutze Delphi6 Prof. (Build 6.190 Upd Pack 1) unter
    Win. 2000. Die Tabelle wurde unter Access2000 erstellt und besitzt auch einen PrimärIndex.

    Anbei habe ich mal die Connection u das
    Dataset eingefügt

    Cut ----------------------------------------

    object ADOConnection1: TADOConnection
    Connected = True
    ConnectionString =
    'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=E:\Pr' +
    'ogramme\Borland\Delphi6\sourcen\CARLOG2\CLDATABAS E\CARLOGDATA.md' +
    'b;Mode=Share Deny None;Extended Properties="";Persist Security I' +
    'nfo=False;Jet OLEDB:System database="";Jet OLEDB:Registry Path="' +
    '";Jet OLEDBatabase Password="";Jet OLEDB:Engine Type=5;Jet OLE' +
    'DBatabase Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;J' +
    'et OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Passw' +
    'ord="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt ' +
    'Database=False;Jet OLEDBon''t Copy Locale on Compact=False;Jet ' +
    'OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False'
    ConnectionTimeout = 5
    CursorLocation = clUseServer
    LoginPrompt = False
    Mode = cmShareDenyNone
    Provider = 'Microsoft.Jet.OLEDB.4.0'
    Left = 560
    Top = 8

    object CLCAR: TBetterADODataSet
    Connection = ADOConnection1
    CursorLocation = clUseServer
    CursorType = ctKeyset
    LockType = ltBatchOptimistic
    CommandText = 'Dbo_CLCAR'
    CommandType = cmdTableDirect
    ParamCheck = False
    Parameters = <>
    Update_Resync = [ResyncAutoIncrement, ResyncConflicts, ResyncUpdates, ResyncInserts]
    RefreshType = rtResyncAll
    Left = 80
    Top = 184

    Cut ----------------------------------------

    Ich habe auch schon auf die Eigenschaft coSeek getestet und das Ergebnis ist True. Im Programm suche ich
    z.B. folgendermaßen:

    CLCAR.Seek(TMP_TOUR_SERIEN_NR); // TMP_TOUR_SERIEN_NR ist vom Typ String

    Für das Feld ist auch ein Index vohanden, der über Indexname zum Zeitpunkt des Seek gesetzt ist.

    Es wäre schön, wenn mir hier jemand helfen könnte, weil ich einfach nicht mehr weiter weiß.

    Vielen Dank!

    Heiko

  • #2
    Hallo,

    aus meinem neuen Buch (ADO mit Delphi) stammt das folgende Beispielprojekt für Seek (als Datenbank wird die Borland-Beispieldatenbank dbdemos.mdb verwendet). <br>
    Nachdem die TADODataSet im <b>cmdTableDirect</b>-Modus die ACCESS-Tabelle geöffnet hat und dabei auch einen <b>Index für die Sortierreihenfolge</b> verwendet (siehe TADODataSet-Eigenschaft <b>IndexName</b>), steht die Methode Seek zur Verfügung, um nach Treffern in diesem Index zu suchen. Über die verschiedenen Seek-Optionen legen Sie fest, welcher Datensatz ausgewählt werden soll. Über die Option <b>soBeforeEQ</b> können Sie zum Beispiel den Datensatzzeiger auf den Datensatz postitionieren, der am nächsten am Suchbegriff dran ist, wenn es keinen direkten Treffer gibt.
    <pre>
    unit SeekDemoFrm;

    interface

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

    type
    TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    ADODataSet1: TADODataSet;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    Label1: TLabel;
    ButtonSeek: TButton;
    StatusBar1: TStatusBar;
    StaticText1: TStaticText;
    EditName: TEdit;
    Label2: TLabel;
    ADODataSet1EmpNo: TIntegerField;
    ADODataSet1LastName: TWideStringField;
    ADODataSet1FirstName: TWideStringField;
    ADODataSet1PhoneExt: TWideStringField;
    ADODataSet1HireDate: TDateTimeField;
    ADODataSet1Salary: TFloatField;
    ButtonSeekLast: TButton;
    ButtonSeekBefore: TButton;
    procedure ButtonSeekClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ButtonSeekLastClick(Sender: TObject);
    procedure ButtonSeekBeforeClick(Sender: TObject);
    private
    { Private-Deklarationen }
    public
    { Public-Deklarationen }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    StaticText1.Caption := ADODataSet1.IndexName;
    end;

    procedure TForm1.ButtonSeekClick(Sender: TObject);
    begin
    ADODataSet1.Seek(EditName.Text)
    end;

    procedure TForm1.ButtonSeekLastClick(Sender: TObject);
    begin
    ADODataSet1.Seek(EditName.Text, soLastEQ)
    end;

    procedure TForm1.ButtonSeekBeforeClick(Sender: TObject);
    begin
    ADODataSet1.Seek(EditName.Text, soBeforeEQ)
    end;

    end.
    </pre>
    DFM-Datei:
    <pre>
    object Form1: TForm1
    Left = 326
    Top = 154
    Width = 531
    Height = 218
    Caption = 'Recordset-Methode Seek: Schnelle Suche bei cmdTableDirect '
    Color = clBtnFace
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -11
    Font.Name = 'MS Sans Serif'
    Font.Style = []
    OldCreateOrder = False
    OnCreate = FormCreate
    PixelsPerInch = 96
    TextHeight = 13
    object Label1: TLabel
    Left = 8
    Top = 12
    Width = 29
    Height = 14
    Caption = 'Index:'
    end
    object Label2: TLabel
    Left = 144
    Top = 12
    Width = 34
    Height = 13
    Caption = 'Suche:'
    end
    object DBGrid1: TDBGrid
    Left = 8
    Top = 40
    Width = 509
    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 ButtonSeek: TButton
    Left = 280
    Top = 8
    Width = 75
    Height = 25
    Caption = 'Seek'
    TabOrder = 1
    OnClick = ButtonSeekClick
    end
    object StatusBar1: TStatusBar
    Left = 0
    Top = 165
    Width = 523
    Height = 19
    Panels = <>
    SimplePanel = True
    end
    object StaticText1: TStaticText
    Left = 40
    Top = 11
    Width = 81
    Height = 18
    AutoSize = False
    BorderStyle = sbsSunken
    Caption = 'StaticText1'
    TabOrder = 3
    end
    object EditName: TEdit
    Left = 184
    Top = 9
    Width = 81
    Height = 21
    TabOrder = 4
    Text = 'Johnson'
    end
    object ButtonSeekLast: TButton
    Left = 360
    Top = 8
    Width = 75
    Height = 25
    Caption = 'Seek Last'
    TabOrder = 5
    OnClick = ButtonSeekLastClick
    end
    object ButtonSeekBefore: TButton
    Left = 440
    Top = 8
    Width = 75
    Height = 25
    Caption = 'Seek Before'
    TabOrder = 6
    OnClick = ButtonSeekBeforeClick
    end
    object ADOConnection1: TADOConnection
    Connected = True
    ConnectionString =
    'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Buch\ADO\CDROM\D' +
    'atabase\dbdemos.mdb;Persist Security Info=False'
    CursorLocation = clUseServer
    LoginPrompt = False
    Mode = cmShareDenyNone
    Provider = 'Microsoft.Jet.OLEDB.4.0'
    Left = 136
    Top = 96
    end
    object ADODataSet1: TADODataSet
    Active = True
    Connection = ADOConnection1
    CursorLocation = clUseServer
    CommandText = 'employee'
    CommandType = cmdTableDirect
    IndexName = 'ByName'
    Parameters = <>
    Left = 168
    Top = 96
    object ADODataSet1EmpNo: TIntegerField
    DisplayWidth = 6
    FieldName = 'EmpNo'
    end
    object ADODataSet1LastName: TWideStringField
    DisplayWidth = 17
    FieldName = 'LastName'
    end
    object ADODataSet1FirstName: TWideStringField
    FieldName = 'FirstName'
    Size = 15
    end
    object ADODataSet1PhoneExt: TWideStringField
    FieldName = 'PhoneExt'
    Size = 4
    end
    object ADODataSet1HireDate: TDateTimeField
    FieldName = 'HireDate'
    end
    object ADODataSet1Salary: TFloatField
    FieldName = 'Salary'
    end
    end
    object DataSource1: TDataSource
    DataSet = ADODataSet1
    Left = 200
    Top = 96
    end
    end
    </pre&gt

    Comment


    • #3
      Hallo Andreas,<br>hast Du evt. Sonderrechte in Bezug auf die max. Anzahl von Zeichen pro Beitrag

      Comment


      • #4
        Hallo Jens,

        ich habe nur über den Button <b>eigenes Profil</b> die maximale Zeichenanzahl auf 20000 erhöht. Das sollte bei jedem funktionieren, oder

        Comment

        Working...
        X