Entwickler-Ecke

Datenbanken - Native ADO-Objekte : Index, Seek


mirom - Do 21.10.04 15:53
Titel: Native ADO-Objekte : Index, Seek
Hello Forum!

Ich verwende native ADO-Objekte für Datenbankzugriff, die mit DAO ( Jet Engine, Access 97 ) erstellt wurde. Möchte eine Tabelle öffnen, die auch Indexe hat. Es sieht so aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  aCon := CoConnection.Create; 
  aCon.Open('..MDB..''''', adConnectUnspecified);

    aRS := CoRecordset.Create;
    aRS.Open('..table..', aCon, adOpenDynamic, adLockReadOnly, adCmdTable);
    if aRS.Supports(adIndex) then
      SendDebug('JA')
    else
      SendDebug('NEIN');


Trotz die Tabelle indexe hat bekomme ich immer NEIN als antwort.

Danke für die Hilfe

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.


smiegel - Do 21.10.04 19:52

Hallo,

bringt folgendes etwas?

Delphi-Quelltext
1:
2:
3:
  aRS:=CoRecordset.Create;  
  aRS.CursorLocation:=adUseServer; // sollte man bei Access-DBs generell machen
  aRS.Open('..table..', aCon, adOpenDynamic, adLockReadOnly, adCmdTable);


grayfox - Do 21.10.04 19:56

hallo mirom!

kann es sein, dass du den cursor auf den client und nicht auf den server gesetzt hast?
aus deinen paar zeilen geht das leider nicht hervor.

lies mal --> hier [http://www.entwickler-forum.de/webx?13@75.aoI8a4eQdWC.3@.ee70d77/1]
oder --> hier [http://www.entwickler-forum.de/webx?50@75.aoI8a4eQdWC.3@.ee88a9c] nach.

mfg, stefan

//edit: smiegel war mal wieder schneller! 8)


mirom - Fr 22.10.04 14:21

Hallo!

leider nicht. Hier is Gesamtcode:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
procedure TfrmPrva.Button4Click(Sender: TObject);
var 
  aCon : _Connection; 
  aRS  : _Recordset;
  txt: string;
begin
  SendDebug('--------');
  aCon := CoConnection.Create;
  aCon.Open(Format('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;',['D:\1\10.MDB']), '''', adConnectUnspecified);
  aCon.CursorLocation:=adUseServer;
  try
    aRS := CoRecordset.Create;
    aRS.CursorLocation:=adUseServer;
    aRS.Open('TahimetrijskiPodaci', aCon, adOpenDynamic, adLockUnspecified, adCmdTableDirect);

    if aRS.Supports(adIndex) then SendDebug('adIndex:JA'else SendDebug('adIndex:NEIN');
    if aRS.Supports(adAddNew) then SendDebug('adAddNew:JA'else SendDebug('adAddNew:NEIN');
    if aRS.Supports(adSeek) then SendDebug('adSeek:JA'else SendDebug('adSeek:NEIN');
    if aRS.Supports(adUpdate) then SendDebug('adUpdate:JA'else SendDebug('adUpdate:NEIN');
    if aRS.Supports(adMovePrevious) then SendDebug('adMovePrevious:JA'else SendDebug('adMovePrevious:NEIN');

    try
      txt := '';   // dummy
    finally 
      aRS.Close; 
      aRS := nil
    end;
  finally 
    aCon.Close; 
    aCon := nil
  end;

  ShowMessage('OK !');


end;


Es wird geantwortet:

adMovePrevious:JA
adUpdate:NEIN
adSeek:NEIN
adAddNew:NEIN
adIndex:NEIN

Habe sämtliche Vorschläge ausprobiert aber immer noch nichts. Nochmals - Datenbank wurde mit Access 97 ( Jet Engine 3.5 ) erstellt. Irgendwo habe ich die Lösung mit DAO und Variants gefunden - ziemlich Primitiv aber funktioniert.
Mittelfristig möchte ich sowieso auf eine andere Datenbank umsteigen – was wäre zu empfehlen, das unter Windows und Linux läuft ?

Danke an alle,
Miro M.

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.


grayfox - Sa 23.10.04 00:11

hallo miro!

schade, dass dir die tipps nicht weitergeholfen haben.
ich verstehe aber immer noch nicht, wozu du überprüfen willst, ob das recordset index und deine angeführten parameter überprüfen muss?
meine erfahrung ist, dass sobald ein index vorhanden ist, dieser auch verwendet wird.

nachdem der datenkatalog unter MsAccess 97 erstellt wurde und du dich über die JetEngine 4.0 verbindest, sollte dein connectionstring nicht so aussehen:

Delphi-Quelltext
1:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=LW:\ordner\katalogname.mdb;Persist Security Info=False;Jet OLEDB:Engine Type=4                    


noch was: welche delphi-version und welchen MDAC verwendest du?

mfg, stefan


mirom - Sa 23.10.04 09:01

Hallo Stefan!

Ich verwende Delphi 7 personal und ADO 2.7. Wie finde ich MDAC Version heraus?

Falls ich im ConnectionString einen Provider=Microsoft.Jet.OLEDB.3.6 eingebe, bekomme ich Exception 'Provider nicht gefunden....' und da weiss ich nicht wie weiter. Noch etwas, bin erst vor etwa 3-4 Wochen von VB zum Delphi.

Danke für Geduld :)

Miro M.


grayfox - So 24.10.04 13:37

hallo míro!

ich denke, dass du eher MDAC 2.7 als ADO 2.7 hast ;)
ok, mit der personal-version bleibt dir nicht viel anderes übrig, als dich auf die nativen komponenten zu stürzen.
allerdings hab ich immer noch nicht verstanden, warum du den index und die methoden überprüfen willst, die der recordset mitbringt.

deine fehlermeldung 'Provider nicht gefunden....' deutet darauf hin, dass du den JetTreiber 3.6 nicht installiert hast. bleib lieber bei der version 4.0, füg aber im connectionstring den enginetyp 4 dazu.

mfg, stefan


mirom - Mo 25.10.04 08:06

Hallo Stefan!

Ich prüfe Index und Seek weil ich eine Tabelle für Schnellsuche indexiert habe. Falls .IsSupported=False, bekomme ich eine Fehlermeldung 'Zugriffsverletzung bei Adresse xxxx. Lesen von Adresse xxxx. Prozess wurde angehalten...'.

connection String habe ich geändert: 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Persist Security Info=False;Jet OLEDB:Engine Type=4' aber bleibt alles gleich.

Zum Testen, habe ich die Datenbank zu Access 2000 Konvertiert, dann bekomme ich:

adMovePrevious:JA
adUpdate:NEIN
adSeek:JA
adAddNew:NEIN
adIndex:JA

trotzdem, bei Indexangabe

aRS.Index := 'I_TP';

bricht ab.

Diese Datenbank wird von meine andere Applikation genutzt, die mit VB6 und DAO Jet 3.5 erstellt wurde. Dort läuft alles sehr gut und ohne Probleme. So wie es aussieht geht es um Kompatibilitätsproblem – DAO Jet 3.5 und ADO 4. Ich versuche noch im Internet was zu finden, sonst bleibe ich bei Variants.

Danke für deine Hilfsbereitschaft!

Miro