Avatar billede nop Nybegynder
25. januar 2007 - 10:35 Der er 8 kommentarer og
2 løsninger

ADO dateTime problem

Følgende giver mig en: "valgfri funktion ikke implementeret" ved execute. Det er jo som det er...
Men er der en anden løsning end at bygge SQL udtrykket som '2007-1-1 10:33:33' ?

procedure TfrmMainDesigner.Button1Click(Sender: TObject);
var
    rs:        TADOQuery;
    sql:    string;
begin
    sql:='insert into test (dt) values (:dt)';
    rs:=TADOQuery.Create(nil);
    rs.Connection:=connection;
    rs.SQL.Add(sql);
    rs.Parameters.ParamByName('dt').value := now;
    rs.ExecSQL;
    rs.Free;
end;
Avatar billede martinlind Nybegynder
25. januar 2007 - 11:51 #1
rs.Parameters.ParamByName('dt').AsDateTime := now;
Avatar billede martinlind Nybegynder
25. januar 2007 - 11:52 #2
eller : rs.Parameters.ParamByName('dt').AsTimeStamp := DateTimeToTimeStamp(now);
Avatar billede nop Nybegynder
25. januar 2007 - 12:09 #3
Men asDateTime eksisterer ikke i Parameter i TadoQuery...?

TParameter = class(TCollectionItem)
  private
    FParameter: _Parameter;
    function GetAttributes: TParameterAttributes;
    function GetDataType: TDataType;
    function GetName: WideString;
    function GetNumericScale: Byte;
    function GetParameter: _Parameter;
    function GetParameterDirection: TParameterDirection;
    function GetPrecision: Byte;
    function GetProperties: Properties;
    function GetSize: Integer;
    function GetValue: Variant;
    procedure SetAttributes(const Value: TParameterAttributes);
    procedure SetDataType(const Value: TDataType);
    procedure SetName(const Value: WideString);
    procedure SetNumericScale(const Value: Byte);
    procedure SetParameterDirection(const Value: TParameterDirection);
    procedure SetPrecision(const Value: Byte);
    procedure SetSize(const Value: Integer);
    procedure SetValue(const Value: Variant);
    function GetParameters: TParameters;
  protected
    procedure AssignTo(Dest: TPersistent); override;
    function GetDisplayName: string; override;
    function IsEqual(Value: TParameter): Boolean;
  public
    procedure Assign(Source: TPersistent); override;
    procedure AppendChunk(Val: OleVariant);
    procedure LoadFromFile(const FileName: string; DataType: TDataType);
    procedure LoadFromStream(Stream: TStream; DataType: TDataType);
    property ParameterObject: _Parameter read GetParameter;
    property Parameters: TParameters read GetParameters;
    property Properties: Properties read GetProperties;
  published
    property Name: WideString read GetName write SetName;
    property Attributes: TParameterAttributes read GetAttributes write SetAttributes default [];
    property DataType: TDataType read GetDataType write SetDataType default ftUnknown;
    property Direction: TParameterDirection read GetParameterDirection write SetParameterDirection default pdInput;
    property NumericScale: Byte read GetNumericScale write SetNumericScale default 0;
    property Precision: Byte read GetPrecision write SetPrecision default 0;
    property Size: Integer read GetSize write SetSize default 0;
    property Value: Variant read GetValue write SetValue;
  end;
Avatar billede martinlind Nybegynder
25. januar 2007 - 13:05 #4
Så prøv at sæt Datatype til noget dato noget

Ellers er det "den lange vej" og få lavet din dato og tid i det format som MSSQL kan forstå ! ( den er ikke særlig flexibel hvad datokonvertering angår ) prøv evt. at drope tiden og kun en dato.

DateTimeToString(Strx,'MM-DD-YYYY',Now);

f.eks.
Avatar billede nop Nybegynder
25. januar 2007 - 13:29 #5
Prøvede lige vha. komponenter på formen; altså connection og en query, der virker det fint med rs.parameters[0].value:=now;
Det er fordi at jeg bare opretter en query sikkert, men kigger videre på det.
øh..?

PS: det med strenge har jeg faktisk styr på (se spørgsmål) det har kørt fint i 2 år, men jeg synes det er fusk. Bruger {td 'yyyy-MM-dd hh:mm.ss.zzz' } og {d 'yyyy-mm-dd'}
på MSSQL og bare strenge uden td/d på alt andet end Access som ved datoer i select xxx where xxx bruger #dd/mm/yyyy (efter windows shortdate format)
Avatar billede nop Nybegynder
25. januar 2007 - 13:55 #6
Jeg løste mit problem:
Når jeg lavede min connection gav jeg den ikke noget navn.

Altså:
    connection.name:='xx';
Får koden i button1 til at virke!

Men tak martinlind, pointene synes jeg tilfalder mig selv, men brok dig hvis du vil have nogle alligevel ;-o)
Avatar billede nop Nybegynder
25. januar 2007 - 13:58 #7
Nej, der var jeg lidt for hurtig, det er nu ikke grunden.
Avatar billede martinlind Nybegynder
25. januar 2007 - 15:05 #8
Hmm, mærkeligt, det name du har sat er det Componet navnet eller hva' for det plejer man da ikke at skulle sætte :(

Fint nok med point's
Avatar billede nop Nybegynder
25. januar 2007 - 15:12 #9
Ja det var komponent navnet...men en fodfejl fik mig til at tro det hjalp.

Jeg har faktisk fundet ud af at det er provideren der er afgørende.
Når jeg bruger SQLOLEDB.1 virker det, men sådan som jeg opretter forbindelse (ODBC) så sættes den til MSDASQL.1

Derfor virkede det med en komponent på formen.
Avatar billede nop Nybegynder
25. januar 2007 - 15:54 #10
Nu fandt jeg løsningen:
http://coding.derkeiler.com/Archive/Delphi/borland.public.delphi.database.ado/2006-07/msg00003.html

Altså:

    rs.Parameters.ParamByName('dt').Value:=Date;
    rs.Parameters.ParamByName('dt').ParameterObject.Type_ := adDBTimeStamp;

Tak for hjælpen martinlind

--nop
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester