Results 1 to 12 of 12

Thread: ADO Probleem met DatumTijd-velden

  1. #1
    Old Navigator Matthijs's Avatar
    Join Date
    Mar 2001
    Location
    Ede, NL. Delphi: Delphi 7/2005 :). Matthijs schrijf je Matthijs
    Posts
    2,199

    ADO Probleem met DatumTijd-velden

    Ik probeer met behulp van ADO-componentjes een ACCESS tabel te vullen met gegevens uit een andere tabel.
    De ene tabel benader ik met de Query: 'SELECT DISTINCT Naam, DatumTijdOpname FROM Bron '
    Deze waarden probeer ik dan in een tweede tabel te plaatsen met de volgende code:
    Code:
      ADOQueryInsert := TADOQuery.Create(nil);
      try
        ADOQueryInsert.Connection := ADOConnection1;
        ADOQueryInsert.SQL.Add('INSERT INTO reizen');
        ADOQueryInsert.SQL.Add('  (Naam, DatumTijdOpname, InUit)');
        ADOQueryInsert.SQL.Add('VALUES');
        ADOQueryInsert.SQL.Add('  (:Naam, :DatumTijdOpname, :InUit)');
        ADOQuerySelect := TADOQuery.Create(nil);
        try
          ADOQuerySelect.Connection := ADOConnection1;
          ADOQuerySelect.SQL.Add('SELECT DISTINCT');
          ADOQuerySelect.SQL.Add('  Naam, DatumTijdOpname');
          ADOQuerySelect.SQL.Add('FROM Meike');
          ADOQuerySelect.Open;
          ADOQuerySelect.First;
          while not ADOQuerySelect.Eof do begin
            for i := 1 to 2 do begin
              ADOQueryInsert.Parameters.Items[0].Value := ADOQuerySelect.Fields[0].Value;
              ADOQueryInsert.Parameters.Items[1].Value := ADOQuerySelect.Fields[1].Value;
              if i = 1 then
                ADOQueryInsert.Parameters.Items[2].Value := 'I'
              else
                ADOQueryInsert.Parameters.Items[2].Value := 'U';
              try
                ADOQueryInsert.ExecSQL;
              except
                on EADOError do begin
                  ShowMessage('Oeps');
                end;
              end;
            end;
            ADOQuerySelect.Next;
          end;
        finally
          ADOQuerySelect.Free;
        end;
      finally
        ADOQueryInsert.Free;
      end;
    Het probleem ontstaat doordat het DatumTijdOpname veld alleen nog maar de datum bevat en geen waarde voor de tijd
    Wat gaat hier fout?
    What's in a sig?

    Would my posting be less valuable if it didnot have a sig? (Vrij naar William S.)

    Let op de kleine lettertjes. For all postings: e&oe!
    This program performed an illegal function, the police are on their way

  2. #2
    Old Navigator Matthijs's Avatar
    Join Date
    Mar 2001
    Location
    Ede, NL. Delphi: Delphi 7/2005 :). Matthijs schrijf je Matthijs
    Posts
    2,199
    Als aanvulling op mijn vraag even het volgende.
    Ik maak gebruik van Access 2000 tabellen, D6.02 en W2K SP2.
    Wil ik akties op de tabellen met ADOQueries dan wil dit niet lukken. Doe ik het zelfde met behulp van BDE Queries dan gaat alles van een leien dakje.
    Ik heb het volgende staan:
    Code:
        with QUpdate do begin
          SQL.Add('UPDATE Reizen SET');
          SQL.Add('  PI = :Tijd');
          SQL.Add('WHERE Naam = :Naam');
          SQL.Add('AND DatumTijdOpname = :DatumTijdOpname');
          SQL.Add('AND InUit = :InUit');
          Prepare;
        end;
    
    // ...
        // Code om de eerste Param te bepalen. 
    // ...
     
          if Datum <> 0 then begin
            QUpdate.Params[0].Value := Datum; // Datum is een TDateTime
            QUpdate.Params[1].Value := Query1.Fields[1].Value;
            QUpdate.Params[2].Value := Query1.Fields[2].Value;
            QUpdate.ExecSQL;
            if QUpdate.RowsAffected = 0 then
              raise Exception.Create('Nee he, niet alweer niet! :(');
          end;
    In het geval van ADOQueries staat er natuurlijk is als
    Code:
    //...
            QUpdate.Parameters.Items[2].Value := Query1.Fields[2].Value;
            if QUpdate.ExecSQL = 0 then
              raise Exception.Create('Nee he, niet alweer niet! :(');
    //...
    Dus begrijp ik het nou niet, of worden op een of andere manier de DT-velden bij ADO niet goed verwerkt?
    Niet dat ik me het laatste kan voorstellen want de data wordt in een DBGridje wel goed getoond. Ik denk dus dat de parameters bij een ADOQuery niet helemaal lekker werken.
    What's in a sig?

    Would my posting be less valuable if it didnot have a sig? (Vrij naar William S.)

    Let op de kleine lettertjes. For all postings: e&oe!
    This program performed an illegal function, the police are on their way

  3. #3
    Senior Member walterheck's Avatar
    Join Date
    Oct 2001
    Location
    Belo Horizonte, Brasil
    Posts
    4,212
    probeer eens:
    Code:
    ADOQuery1.Parameters.ParamByName('help').DataType:=ftDateTime;
    misschien dat dat helpt... je kunt dit ook designtime in de object inspector instellen
    Nee, de Romeinen spraken geen ISO-8859-1 LATIN

  4. #4
    Hmm, ik lees inderdaad nogal wat problemen met date/time en ADO. Je zou inderdaad kunnen proberen je type te zetten, maar ook opvragen en opslaan met .AsDateTime of AsString in plaats van .Value zou kunnen helpen.
    Marcel

  5. #5
    Old Navigator Matthijs's Avatar
    Join Date
    Mar 2001
    Location
    Ede, NL. Delphi: Delphi 7/2005 :). Matthijs schrijf je Matthijs
    Posts
    2,199
    Allerlei variaties heb ik geprobeerd. Ook bij het tracen geeft de tooltip bij de variabelen de juiste waarde weer.
    Het aangeven van het datatype van de parameters in designtime (of runtime) wou ook niet werken.
    Dus ik zal eens zoeken op community.borland! (Of zou daar niks te vinden zijn?)
    What's in a sig?

    Would my posting be less valuable if it didnot have a sig? (Vrij naar William S.)

    Let op de kleine lettertjes. For all postings: e&oe!
    This program performed an illegal function, the police are on their way

  6. #6
    Als de tooltip de juiste waarde geeft zit het probleem dus blijkbaar in de parameters. Je zou als workaround van de parameters af kunnen stappen en dan [DatumTijdOpname] zetten op de plaats waar nu de parameter staat. Met een StringReplace vervang je dan steeds [DatumTijdOpname] door DateTimeField.AsString. De query wordt door Access toch niet geprepared, dus ik verwacht eigenlijk niet eens performanceverlies.
    Marcel

  7. #7
    Old Navigator Matthijs's Avatar
    Join Date
    Mar 2001
    Location
    Ede, NL. Delphi: Delphi 7/2005 :). Matthijs schrijf je Matthijs
    Posts
    2,199
    Je bedoelt dus dat in het SQL-statement steeds direct de values worden ingevuld en niet meer met parameters werken? Is het dan niet sneller en eenvoudiger om in plaats van StringReplace te gebruiken iedere keer gewoon SQL[3] op nieuw te bepalen?

    Of begrijp ik je verkeerd?
    What's in a sig?

    Would my posting be less valuable if it didnot have a sig? (Vrij naar William S.)

    Let op de kleine lettertjes. For all postings: e&oe!
    This program performed an illegal function, the police are on their way

  8. #8
    Dat komt inderdaad op hetzelfde neer. Had ik even niet aan gedacht omdat ik de querystring altijd designtime vul en niet runtime.
    Marcel

  9. #9
    Old Navigator Matthijs's Avatar
    Join Date
    Mar 2001
    Location
    Ede, NL. Delphi: Delphi 7/2005 :). Matthijs schrijf je Matthijs
    Posts
    2,199
    Goed. Hoe is het dan netjes op te lossen? Op de volgende manier:
    Code:
      ADOQInsert := TADOQuery.Create(nil);
      ADOQInsert.Connection := ADOConnection2;
      ADOQInsert.ParamCheck := False; // NB. Trés Importante!!!!!!!!!!
      ADOQuery2.Open;
      while not ADOQuery2.Eof do begin
        TempStr := DateTimeToStr(ADOQuery2.Fields[2].AsDateTime);
        TempStr := 'INSERT INTO Test (DatumTijd) Values (#' + TempStr + '#)';
        ADOQInsert.SQL.Clear;
        ADOQInsert.SQL.Text := TempStr;
        ADOQInsert.ExecSQL;
        ADOQuery2.Next;
      end;
    Waarom is het zetten van ParamCheck op False zo belangrijk? Als deze code wordt uitgevoerd komt het SQL-statement er bijvoorbeeld als volgt uit te zien:
    Code:
      INSERT INTO Test (DatumTijd) VALUES (#18/04/2002 17:10:00#)
    Delphi denkt dan als ParamCheck op True staat dat er parameters in de Query staan en dan vindt Delphi dit niet goed gedefinieerd en krijg je allerlei foutmeldingen!
    Bovendien mag je dit statement niet zetten nadat je het SQL-propertie hebt gewijzigd want dan krijg je nog de foutmelding!
    Probeer je Quotes om de tijd heen te zetten krijg je weer een foutmelding van Access.

    Goed, dit werkt dus. Maar ... ben ik hier blij mee? Nee niet echt. Ik vond het met de parameters veel overzichtelijker. Op deze manier werkt het dus met Access, nu alleen nog even uitzoeken of dit bij MS SQL-Server ook zo werkt!
    What's in a sig?

    Would my posting be less valuable if it didnot have a sig? (Vrij naar William S.)

    Let op de kleine lettertjes. For all postings: e&oe!
    This program performed an illegal function, the police are on their way

  10. #10
    TDelphiDeveloper Baldo's Avatar
    Join Date
    Apr 2002
    Location
    Hellevoetsluis
    Posts
    498
    Ik heb zelf in het verleden problemen gehad met de queryparser van ADO. Parameters werden vaak niet gedetecteerd of als het juiste type gezien. Het scheelde al veel als ik de query eerste als string opbouwde en dan in 1 keer in het query component zette. Wat helemaal hielp, was in expliciet Access formaat parameters aangeven.

    Een query als de volgende:

    parameters prmNaam Text, prmInvoerDatum DateTime, prmBericht Memo;
    insert into Boodschappen
    values(prmNaam, prmInvoerDatum, prmBericht)

    Geeft netjes een juiste datetime parameter met de naam prmInvoerDatum.
    Why is it that every time I think I'm holding all the cards, it turns out we're playing chess?
    Download Re-Depend, onmisbaar als je met packages build

  11. #11
    Old Navigator Matthijs's Avatar
    Join Date
    Mar 2001
    Location
    Ede, NL. Delphi: Delphi 7/2005 :). Matthijs schrijf je Matthijs
    Posts
    2,199
    Zo ik ben nog even verder aan het testen geweest.
    Code:
    begin
      DatumTijd := Trunc(DateTimePicker1.DateTime) + Frac(DateTimePicker2.DateTime);
      Panel1.Caption := DateTimeToStr(DatumTijd);
      ADOQWerk := TADOQuery.Create(nil);
      try
        with ADOQWerk do begin
          if TButton(Sender).Name = 'ButtonJet' then Connection := ADOConnection1
                                                else Connection := ADOConnection2;
          SQL.Clear;
          SQL.Add('INSERT INTO TestTabel (DatumTijd, Naam)');
          SQL.Add('VALUES (:DatumTijd, :Naam)');
          Parameters.Items[0].Value := DatumTijd;
          Parameters.Items[1].Value := Edit1.Text;
          ExecSQL;
        end;
      finally
        ADOQWerk.Free;
      end;
      ADOTable1.Close;
      ADOTable2.Close;
      ADOTable1.Open;
      ADOTable2.Open;
    end;
    En dit is de bijbehorende DFM.
    Code:
    //.... Plenty andere stuff
      object ADOConnection1: TADOConnection
        ConnectionString = 
          'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Projecten\TallyH' +
          'o\Testen\test.mdb;Persist Security Info=False'
        LoginPrompt = False
        Mode = cmShareDenyNone
        Provider = 'Microsoft.Jet.OLEDB.4.0'
    //.... nog meer stuff
      object ADOConnection2: TADOConnection
        ConnectionString = 'Provider=MSDASQL.1;Persist Security Info=Fal'+ 
        'se;Data Source=Test'
        LoginPrompt = False
        Provider = 'MSDASQL.1'
    //.... en fin , de rest.
    Nu mogen jullie raden :)

    Als de boel via Jet gepost wordt, werkt een en andere feilloos. Wordt het via een ODBC-gegevens bron (een System DSN) dan raakt onderweg de tijd informatie pleitte.
    What's in a sig?

    Would my posting be less valuable if it didnot have a sig? (Vrij naar William S.)

    Let op de kleine lettertjes. For all postings: e&oe!
    This program performed an illegal function, the police are on their way

  12. #12
    TDelphiDeveloper Baldo's Avatar
    Join Date
    Apr 2002
    Location
    Hellevoetsluis
    Posts
    498
    Ik moet toegeven, ik zit net te testen en bij mij is een ODBC koppeling via een system DSN ook bagger. Ik krijg al meldingen als ik een table open waar een datetime field in zit. En m' query met datetime resulteert in "ongeldige precisie" meldingen... Weird... Ik zou gewoon Jet gebruiken. Veel veiliger en stabieler.
    Why is it that every time I think I'm holding all the cards, it turns out we're playing chess?
    Download Re-Depend, onmisbaar als je met packages build

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. Raar probleem met SQL
    By bartje in forum Databases
    Replies: 8
    Last Post: 04-Dec-03, 11:03
  2. Probleem met DBGrid en Maskedits
    By B@rt in forum Databases
    Replies: 2
    Last Post: 28-Nov-03, 00:46
  3. Probleem met een QUERY
    By Delphibeginner in forum Databases
    Replies: 15
    Last Post: 20-Nov-03, 21:18
  4. probleem met sorteren DBGrid
    By pdebie in forum Algemeen
    Replies: 4
    Last Post: 09-Dec-02, 09:44

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •