[Mono-list] Bug (?) in SqliteDataReader

Nikki Locke nikki at trumphurst.com
Fri May 26 05:30:03 EDT 2006


Joshua Tauberer wrote:
> Nikki Locke wrote: 
> > So I tried some code to insert a DateTime in a parameter. I used the 
> > following code... 
> > 
> > string sql = "insert into tester (testdate) values (?)"; 
>  
> If you use a named parameter, i.e. ?var, it should work.  Unnamed 
> parameters weren't implemented.  (I just committed a fix for that.) 

What you suggest does not work. I looked up the syntax, and the correct syntax is 
":var". This appears to work (although, obviously, the DateTime.Parse bug still 
applies). Interestingly, it doesn't work with Finisar.SQLite!

> > I think that, in order to avoid breaking existing code, the default should be much 
> > as it is now, EXCEPT do not convert strings to DateTimes in ReadpVm 
> > (SqliteDataReader, about line 188). That would stop it giving an exception when a 
> > string is inserted in a DateTime. It would also prevent the DateTime getting 
> > converted back into a string by the DataTable (which is what makes the original 
> > value unrecoverable). 
>  
> Well, what makes the original value unrecoverable is an independent bug 
> in DateTime.Parse (for reference: it is parsing strings like 02/01/2005 
> with the U.S. format when the current culture is UK).  Importantly, 
> knowing where the bug is means the workaround is in your own code that 
> parses the contents of the DataTable. 

Sorry, I don't think I understand. Are you suggesting I write my own date parsing 
routine?

> The second work-around was to have GetSchemaTable return DateTime where 
> possible, so that the DateTimes the SqliteClient is already parsing 
> don't get converted back into strings that need parsing in user code. 
> Despite my earlier objections, this seems like a reasonable thing to do. 

Oh good - my constant nagging has convinced you then :-)

> The third word-around is to stop parsing strings to DateTimes in 
> SqliteClient.  Given this changes the data types people get back from 
> the SqliteDataReader, I'm very hesitant to change this except through a 
> connection string parameter. 

Well, the suggested behaviour is more consistent, less prone to unexpected exceptions, 
and avoids existing problems (e.g. what do you think happens to a string which contains 
something parseable as a DateTime, plus some additional information?). It should at 
least be an option. Personally, I think it should be the default.

> But these are all workarounds and it would be nice to just fix DateTime 
> before proceeding.

I agree.

However, having studied the code for the DateTime parsing, I see from the comments that 
this bug is deliberate (to the extent that the necessary information about the likely 
DateTime formats to be encountered in a Culture has a FIXME: not supported comment).

I would try to offer a patch for it myself, but I'm at a bit of a loss how it should 
work.

-- 
Nikki Locke, Trumphurst Ltd.      PC & Unix consultancy & programming
http://www.trumphurst.com/




More information about the Mono-list mailing list