Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi _Recordset erstellen (https://www.delphipraxis.net/171588-_recordset-erstellen.html)

HendrikM 14. Nov 2012 07:20


_Recordset erstellen
 
Ich bin gerade bei Umstieg von D 6/XP auf XE2/Win7.
unter den D6 Bedingungen hatte ich folgendes:
Delphi-Quellcode:
     FRSet:=CreateComObject(CLASS_RECORDSET) as _Recordset;
     FRSet.CursorLocation:=adUseClient;
     FRSet.Fields.Append('k',adInteger,4,adFldKeyColumn);
     FRSet.Fields.Append('POSX',adSingle,0,adFldUnspecified);
     FRSet.Fields.Append('POSY',adSingle,0,adFldUnspecified);
     FRSet.Open(EmptyParam,EmptyParam,adOpenUnspecified,adOpenUnspecified);
was immer funktioniert hat.
Unter XE2 beklagt sich der Compiler: "Nicht genügend Parameter" (beim 1. Append bereits).
OK: auf folgendes geändert:
Delphi-Quellcode:
     FRSet:=CreateComObject(CLASS_RECORDSET) as _Recordset;
     FRSet.CursorLocation:=adUseClient;
     FRSet.Fields.Append('k',adInteger,0,adFldKeyColumn,0);
     FRSet.Fields.Append('POSX',adSingle,0,adFldUnspecified,0);
     FRSet.Fields.Append('POSY',adSingle,0,adFldUnspecified,0);
     FRSet.Open(EmptyParam,EmptyParam,adOpenUnspecified,adOpenUnspecified,0);
Damit war der Compiler erstmal beruhigt.
Während der Laufzeit erhalte ich dann die Fehlermeldung:
"Die Argumente sind vom falschen Typ, liegen außerhalb des Gültigkeitsbereichs oder sind miteinander unvereinbar"
Frage wie geht es richtig?

Furtbichler 14. Nov 2012 07:39

AW: _Recordset erstellen
 
In welcher Zeile?

Bitte verwende die DELPHI-Tags, um deinen Code zu formatieren: Den Code markieren und dann auf das Delphi/Sparta-Symbol oben klicken.

HendrikM 14. Nov 2012 07:59

AW: _Recordset erstellen
 
Delphi-Quellcode:
FRSet.Fields.Append('k',adInteger,0,adFldKeyColumn ,0);

mkinzler 14. Nov 2012 08:36

AW: _Recordset erstellen
 
Bearbeite bitte die Tags auch noch im 1. Beitrag.
Danke.

jaenicke 14. Nov 2012 09:12

AW: _Recordset erstellen
 
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
Zitat:

The FieldValue parameter is only valid when adding a Field object to a Record object, not to a Recordset object. With a Record object, you can append fields and provide values at the same time. With a Recordset object, you must create fields while the Recordset is closed, and then open the Recordset and assign values to the fields.
Ich vermute daher du musst NULL oder ähnliches übergeben.

himitsu 14. Nov 2012 09:19

AW: _Recordset erstellen
 
Wobei ich aber nicht erkennen kann, warum dort 5 Parameter hin sollen.

Zitat:

Delphi-Quellcode:
// *********************************************************************//
// Interface: Fields
// Flags:    (4544) Dual NonExtensible OleAutomation Dispatchable
// GUID:     {0000054D-0000-0010-8000-00AA006D2EA4}
// *********************************************************************//
  Fields = interface(Fields15)
    ['{0000054D-0000-0010-8000-00AA006D2EA4}']
    procedure Append(const Name: WideString; Type_: DataTypeEnum; DefinedSize: Integer;
                     Attrib: FieldAttributeEnum); safecall;
    procedure Delete(Index: OleVariant); safecall;
  end;

In XE ist es noch so deklariert. :gruebel:

Oder sieht das bei dir anders aus?


Welche Version dieser API nutzt du denn?
(Ich hoffe doch die Richtige/Passende :stupid: )

Unit ADODB2000, ADODBXP, ADODB2010, Data.Win.ADODB oder Winapi.ADOInt?

Delphi-Quellcode:
// *********************************************************************//
// Interface: Fields
// Flags:    (4544) Dual NonExtensible OleAutomation Dispatchable
// GUID:     {00001564-0000-0010-8000-00AA006D2EA4}
// *********************************************************************//
  Fields = interface(Fields20)
    ['{00001564-0000-0010-8000-00AA006D2EA4}']
    procedure Append(const Name: WideString; Type_: DataTypeEnum; DefinedSize: Integer;
                     Attrib: FieldAttributeEnum; FieldValue: OleVariant); safecall;
    procedure Update; safecall;
    procedure Resync(ResyncValues: ResyncEnum); safecall;
    procedure CancelUpdate; safecall;
  end;
In Allem nach XP gibt es den 5. Parameter, dann könnte das mit dem NULL oder einem EMPTY eventuell passen.

HendrikM 14. Nov 2012 09:29

AW: _Recordset erstellen
 
Vielleicht hatte ich die ersten 2 Zeilen vergessen zu erwähnen:
Delphi-Quellcode:
     FRSet:=CreateComObject(CLASS_RECORDSET) as _Recordset;
     FRSet.CursorLocation:=adUseClient;
     FRSet.Fields.Append('k',adInteger,0,adFldKeyColumn,0);
     FRSet.Fields.Append('POSX',adSingle,0,adFldUnspecified,0);
     FRSet.Fields.Append('POSY',adSingle,0,adFldUnspecified,0);
     FRSet.Open(EmptyParam,EmptyParam,adOpenUnspecified,adOpenUnspecified,0);
und dann sieht das so aus in der Winapi.ADOInt:
Delphi-Quellcode:
  Fields = interface(Fields20)
    ['{00000564-0000-0010-8000-00AA006D2EA4}']
    procedure Append(const Name: WideString; Type_: DataTypeEnum; DefinedSize: ADO_LONGPTR;
                     Attrib: FieldAttributeEnum; FieldValue: OleVariant); safecall;
    procedure Update; safecall;
    procedure Resync(ResyncValues: ResyncEnum); safecall;
    procedure CancelUpdate; safecall;
  end;

HendrikM 14. Nov 2012 11:21

AW: _Recordset erstellen
 
Hallo zusammen,
EmptyParam ist richtig!
Danke für die Unterstützung


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz