Avatar billede kennethv Nybegynder
03. august 2009 - 09:13 Der er 11 kommentarer og
1 løsning

Opdatere record med dags dato.

Jeg har en query hvor jeg opdatere et felt med 1. I den il jeg gerne opdatere et andet felt med dags dato og kun dato ikke tid. Men hvordan klare jeg den?

Query.SQL.Text := 'update StaffLeftCompany set DateOfITUpdate = DAGSDATO set reminder = reminder + 1 where SecurityCode =' + quotedstr(ADOQuery1.FieldByName('SECURITYCODE').AsString);
Avatar billede hrc Mester
03. august 2009 - 09:46 #1
Nu det er noget Delphi du viser så springer jeg ind med et indlæg: Det bedste råd mht. databaser er, at lade være med at formatere din SQL på denne måde du gør. Brug parameter i stedet:

Query.SQL.Clear;
Query.SQL.Add('update StaffLeftCompany');
Query.SQL.Add('set DateOfITUpdate = :DateOfITUpdate,');
Query.SQL.Add('    reminder = reminder + 1');
Query.SQL.Add('where (SecurityCode = :SecurityCode)');
Query.Parameters.ParamByName('DateOfITUpdate).Value := DateOf(now);
Query.Parameters.ParamByName('SecurityCode).Value := ADOQuery1.FieldByName('SECURITYCODE').AsString;


Der er mange fordele. Den største er at du slipper for QuotedStr og lignende. Et andet argument er, at det er sådan det er tænkt fra de der lavede TQuery (som alle datasæt-varianter vist er nedarvet fra)

DateOf() findes i DateUtils-unitten.
Avatar billede kennethv Nybegynder
03. august 2009 - 10:07 #2
Jeg kan godt se hvad du mener og det vil osse være meget nemmere at gøre sådan som du beskriver. Så det vil jeg helt klart benytte mig af. Tak for det. Du må gerne ligge et svar.
Avatar billede hrc Mester
03. august 2009 - 10:22 #3
Et svar. En lille detalje mht parametrene er, at de har en DataType som nogle gange skal sættes. Desuden har de en property for hvilken retning data skal gå (input eller output-parameter). De ting plejer jeg at sætte for pludselig skal jeg tildele via en variant og er den null så ved ingen hvilken datatype der vælges.

  with Query.Parameters.ParamByName('ID') do
  begin
    DataType := ftInteger;
    ParamType := ptInput;
    Value := ADOBorger.FieldByName('ID').Value;
  end;

i øvrigt bruger jeg aldrig Value på feltet da AsInteger, AsString og andre, er fejlsikre.

  with Query.Parameters.ParamByName('ID') do
  begin
    DataType := ftInteger;
    ParamType := ptInput;
    Value := ADOBorger.FieldByName('ID').AsInteger;
  end;

Denne ret omstændige opsætning af en parameter har jeg kogt ned i et funktionskald (SetParam(aDataSet,aParameter,aDataType,aVærdi,aSetNull);
Avatar billede kennethv Nybegynder
03. august 2009 - 10:54 #4
Hmm, har alt dette noget med denne fejl at gøre:

"The data type nvarchar(max) and ntext are incompatible in the equal to operator"
Avatar billede hrc Mester
03. august 2009 - 10:56 #5
Prøv at sætte DataType til ftMemo.
Avatar billede kennethv Nybegynder
03. august 2009 - 11:01 #6
Ja, min securitycode har data type i db nvarchar(max). den rettede jeg så til ntext, men nu er fejlen bare:

"The data type ntext and ntext are incompatible in the equal to operator"
Avatar billede kennethv Nybegynder
03. august 2009 - 11:03 #7
Jeg har ikke en DataType: ftMemo i min SQL db.
Avatar billede kennethv Nybegynder
03. august 2009 - 11:16 #8
Jeg flytter dette over i delphi.
Avatar billede hrc Mester
03. august 2009 - 11:22 #9
(hvad flyttede du over i Delphi - løsningen?)

Næ, men det har din ADOQuery (måske virker det ikke, men prøv det). Dobbeltklik på ADOQueryen og vælg alle felter. I SecurityCode kan du sætte properties. Det løste problemet for mig engang da jeg skulle have et ntext-data over i en RichText komponent.

Hvorfor har du i øvrigt en SecurityCode som er nvarchar(max)? Det kan da ikke passe, at du maksimalt vil have en nøgle på 2Gb tegn?

Alternativt kan du måske sætte noget her (det er svært når man må gætte sig til resten af programmet - som i sagens natur ikke kan kopieres over her):

  with Query.Parameters.ParamByName('SecurityCode') do
  begin
    DataType := ftMemo; // findes vist også en ftWideMemo
    ParamType := ptInput;
    Value := SomeSecurityCode;
  end;
Avatar billede kennethv Nybegynder
03. august 2009 - 11:25 #10
:) Er det ikke et delphi problem?
Avatar billede kennethv Nybegynder
03. august 2009 - 11:33 #11
Jeg kan ikke vælge felter på ADOQuery.
Fejl: Missing SQL property

Angående spørgsmål til SecurityCode omkring 2Gb tegn, kan jeg sige. "Næ, det skal jeg heller ikke. Det var bare det der var standard. Tænkte ikke sådan lige over hvor meget det vil fylde". Kan du anbefale en datatype?
Avatar billede kennethv Nybegynder
03. august 2009 - 11:44 #12
Jeg prøvede:

try
Query := TADOQuery.Create(Nil);
Query.Connection := ADOConnection1;
with Query do
begin
  SQL.Clear;
  SQL.Add('Update StaffLeftCompany');
  SQL.Add('Set DateOfITUpdate = :DateOfITUpdate,');
  SQL.Add(' reminder = reminder + 1 ');
  SQL.Add('Where SecurityCode = :SecurityCode');
  Parameters.ParamByName('DateOfITUpdate').Value := DateOf(now);
  with query.Parameters.ParamByName('SecurityCode') do
  begin
    DataType := ftMemo; // findes vist også en ftWideMemo
    Value := ADOQuery1.FieldByName('SECURITYCODE').AsString;
  end;
  Prepared := true;
  ExecSQL;
end;
finally
Query.Free;
end;

Det giver mig den samme fejl.

ParamType kunne den ikke finde. Virker ikke som at den havde denne egenskab.
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
Computerworld tilbyder specialiserede kurser i database-management

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