[Delphi / MSSQL] Hoe milliseconden uit DB halen via ODBC

Pagina: 1
Acties:

  • Black Hawk
  • Registratie: Oktober 2003
  • Laatst online: 08-01 21:48
Ik zit met het volgende probleem: ik wil vanuit DELPHI 7 via een ODBC connectie een DATETIME field uit een MS SQL 2000 database halen, maar krijg niet de milliseconden in delphi.
(en voor de volledigheid: mijn OS is Win 2000 SP4)

Ik heb nu deze transform-functie
Delphi:
1
2
3
4
5
function SQLDateTimeToDelphi( SQLDate: OCIH.TDate; SQLTime: OCIH.TTime ): TDateTime;
begin
  Result := EncodeDateTime( sqldate.year, sqldate.month,  sqldate.day,
                            sqltime.hour, sqltime.minute, sqltime.second, 0);
end;

en die roep ik aan met
Delphi:
1
2
3
4
5
6
7
8
var insertedTime : TDateTime;
var ODBCquery1 : THstmt;

with ODBCquery1 do
begin
  insertedTime := SQLDateTimeToDelphi( ColDateByName['insertedTime'],
                                       ColTimeByName['insertedTime'] );
end

Maar het probleem zit hem in dat ik in de OCIH (ODBC Call-Level Interface Header) niet kan vinden hoe ik milliseconden kan verkrijgen. Ik moet deze OCIH gebruiken, omdat de functies Col**ByName resp. OCIH.TDate en OCIH.TTime retourneren.

Heeft er iemand een oplossing voor hoe ik dus een datum/tijd veld uit de DB INCLUSIEF milliseconden kan ophalen in Delphi?

Wie nooit tijd heeft, kan er niet mee omgaan.


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 14:04

TeeDee

CQB 241

Voor zover ik mij kan herinneren zit er in TTime gewoon een Millisecond property.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Black Hawk
  • Registratie: Oktober 2003
  • Laatst online: 08-01 21:48
TeeDee schreef op donderdag 15 februari 2007 @ 11:20:
Voor zover ik mij kan herinneren zit er in TTime gewoon een Millisecond property.
Nee, alleen deze:

code:
1
2
3
4
TTime properties:
   - hour 
   - minute 
   - second


En daar zit ook gelijk het probleem, want de functie ColTimeByName (of ColTIme) retourneren allebei TTime, die dus geen milliseconden bevat. Dus moet ik iets anders gebruiken, maar wat?

(trouwens, zoeken op Google(-groups), GoT etc levert hierover niks op. Maar heeft dan niemand dit zelf ook een keer gehad?)

Wie nooit tijd heeft, kan er niet mee omgaan.


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 14:04

TeeDee

CQB 241

En als je nu TTime aan TMilliseconds voert?

http://www.cubik.org/mirr...lasses/TMilliseconds.html

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Black Hawk
  • Registratie: Oktober 2003
  • Laatst online: 08-01 21:48
TMilliseconds is zo te zien een C/C++ class. Hij bestaat niet in Delphi. Een soorgelijke in Delphi is
Delphi:
1
2
3
4
5
function MilliSecondOfTheSecond( const AValue: TDateTime ): Word;

'Call MilliSecondOfTheSecond to obtain the millisecond of the second'
'represented by a specified TDateTime value. MilliSecondOfTheSecond'
'returns a value between 0 and 999.'


Maar als ik hem aanroep krijg ik het volgende:
code:
1
Incompatible types: 'TDateTime' and 'TTime'

Ik heb dus een TTime, die komt van de functie ColTimeByName() en ik denk zelf dat ik daar een andere functie voor moet gebruiken, maar welke?

[ Voor 9% gewijzigd door Black Hawk op 15-02-2007 12:31 ]

Wie nooit tijd heeft, kan er niet mee omgaan.


  • Black Hawk
  • Registratie: Oktober 2003
  • Laatst online: 08-01 21:48
Ik heb inmiddels de oplossing gevonden. Hieronder de code

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{:Convert a ocih.TDate and ocih.TTimeStamp into a TDateTime}
function SQLDateTimeToDelphi( SQLDate: ocih.tdate; SQLTime: ocih.TTimeStamp ): TDateTime;
begin
  Result := EncodeDateTime( sqldate.year, sqldate.month,  sqldate.day,
                            sqltime.hour, sqltime.minute, sqltime.second,
                            MillisecondsOf( SQLTime.fraction ) );

end;

{:Returns the first 3 millisecond-positions of the given milliseconds}
function MillisecondsOf ( milliseconds: Cardinal ) : Word;
begin
  Result := StrToInt( copy( IntToStr( milliseconds ), 0, 3 ) );
end;

Wie nooit tijd heeft, kan er niet mee omgaan.

Pagina: 1