[OleDb] afronding miliseconden probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
Heren,

Mijn klomp is gebroken.

Ik heb een situatie waarin ik een probleem heb met de datetime conversie van mijn OleDb Driver.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
OleDbConnection conn = new OleDbConnection(connectionstring);
conn.Open();


DateTime datetime = DateTime.Now;
OleDbCommand command = new OleDbCommand("SELECT * FROM tabel WHERE id = 1", conn);
OleDbDataReader reader = command.ExecuteReader();
while (reader.Read())
    datetime = (DateTime)reader["datumtijd"];

reader.Close();


OleDbCommand command2 = new OleDbCommand("SELECT * FROM tabel WHERE datumtijd = ?", conn);
command2.Parameters.Add(new OleDbParameter("datumtijd", datetime));

OleDbDataReader reader2 = command2.ExecuteReader();

bool found = false;
while (reader2.Read())
{
    DateTime foundDatetime = (DateTime)reader2["datumtijd"];
    if (foundDatetime == datetime)
        found = true;
}
reader2.Close();

if (!found)
    MessageBox.Show("errorrtty");


probleemstelling:
Ik denk dat de code vrij self-explaining is, maar bij deze dus wat ik constateer:
1: ik haal een record op uit de database, (op primairy key)
2: ik pak de datetime veld uit die tabel (die in mijn testcase gewoon 2 kolommen heeft)
3: ik selecteer op dezelfde database aan de hand van de zojuist opgehaalde datetime.
4: ik krijg geen resultaten terug (of andere)

details:
Mijn eerst opgehaalde datum is in mijn geval "2010-1-1 00:00:00:106" (waarbij 106 dus miliseconden zijn)
Wanneer ik nu de tweede query uitvoer krijg ik alle records terug die in mijn database de waarde "2010-1-1 00:00:00:103" hebben.

Ditzelfde heb ik wanneer ik een query uitvoer met als waarde 103, en ik alle records terugkrijg waarbij de datetime 100 miliseconden heeft.

vraag:
Kan iemand dit verklaren, en beter, een oplossing geven? ik wordt er helemaal gek van

[ Voor 3% gewijzigd door BasieP op 08-02-2010 16:07 ]

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 17-09 16:09

NetForce1

(inspiratie == 0) -> true

Is dit toevallig op MS SQL Server? Dan is het een (gedocumenteerde, maar daarom niet minder gammele) afronding, zie: http://technet.microsoft.com/en-us/library/ms187819.aspx

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:56
Als het op Sql Server is, dan vraag ik me af waarom je de OleDb implementatie gaat gebruiken, ipv de Sql implementatie.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
In mijn geval is het niet MS SQL maar Sybase, maar aan de andere kant is MSSQL een followup van sybase, dus wat dat betreft zou het best met elkaar te maken kunnen hebben.

Echter is mijn probleem niet dat ik getallen in de database vergelijk met getallen in mijn applicatie, maar dat ik een valide database waarde uitlees, en (zonder modificatie) weer wil gebruiken (in een select) waarna er gewoon 3 miliseconden afgehaalt worden

Ik gok dat waar jij met een overzichtje komt zoals hieronder:
01/01/98 23:59:59.995
01/01/98 23:59:59.996
01/01/98 23:59:59.997
01/01/98 23:59:59.998
1998-01-01 23:59:59.997
01/01/98 23:59:59.992
01/01/98 23:59:59.993
01/01/98 23:59:59.994
1998-01-01 23:59:59.993
01/01/98 23:59:59.990
01/01/98 23:59:59.991
01/01/98 23:59:59.999
1998-01-01 23:59:59.990



ik denk dat het voor sybase misschien wel zo werkt:

01/01/98 23:59:59.990
01/01/98 23:59:59.991
01/01/98 23:59:59.992
01/01/98 23:59:59.993
1998-01-01 23:59:59.990

01/01/98 23:59:59.994
01/01/98 23:59:59.995
01/01/98 23:59:59.996
1998-01-01 23:59:59.993

01/01/98 23:59:59.997
01/01/98 23:59:59.998
01/01/98 23:59:59.999
1998-01-01 23:59:59.996
Als het op Sql Server is, dan vraag ik me af waarom je de OleDb implementatie gaat gebruiken, ipv de Sql implementatie.
buiten dat het dus geen mssql is, schijnt men hier het idee te hebben dat door het gebruik van dingen als oledb applicaties flexibeler worden

[ Voor 9% gewijzigd door BasieP op 08-02-2010 16:35 ]

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
En wat gebeurt er op je database (in de veronderstelling dat je je sessie kunt monitoren)? Staat daar in je (tweede) query 2010-1-1 00:00:00:106 of 2010-1-1 00:00:00:103? In het eerste geval doet Sybase gek, in het tweede geval moet je het zoeken in je C# code....ik zet mijn geld op een probleem in de C# code.

When life gives you lemons, start a battery factory


Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
KabouterSuper schreef op maandag 08 februari 2010 @ 16:29:
En wat gebeurt er op je database (in de veronderstelling dat je je sessie kunt monitoren)? Staat daar in je (tweede) query 2010-1-1 00:00:00:106 of 2010-1-1 00:00:00:103? In het eerste geval doet Sybase gek, in het tweede geval moet je het zoeken in je C# code....ik zet mijn geld op een probleem in de C# code.
Ik weet niet heel veel van databases, dus sessie monitoren is nieuw voor me, maar dat ga ik proberen.

Sowieso is het geen C# probleem (iig niet mijn eigen code), want die OleDb classes komen uit een of andere dll.

This message was sent on 100% recyclable electrons.

Pagina: 1