When I insert date values into a SQLite database using an unparameterized query everything works as expected. However, if I use a parameterized query then a slightly different value for the DateTime is inserted into the database.
Here is a code sample that demonstrates the issue:
Code: Select all
static void Main(string[] args)
{
var cs = new SQLiteConnectionStringBuilder();
cs.FailIfMissing = false;
cs.DataSource = "test.db";
var cnn = new SQLiteConnection(cs.ConnectionString);
cnn.Open();
var cmd = cnn.CreateCommand();
cmd.CommandText = "CREATE TABLE IF NOT EXISTS TestTable (SomeText TEXT, SomeDateTime DATETIME)";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO TestTable VALUES ('test', '2000-01-01')";
cmd.ExecuteNonQuery();
// this works - INSERT worked as expected
cmd.CommandText = "SELECT COUNT(*) FROM TestTable WHERE SomeDateTime = '2000-01-01'";
var rowCount = Convert.ToInt32(cmd.ExecuteScalar());
Debug.Assert(rowCount == 1);
cmd.CommandText = "DELETE FROM TestTable";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO TestTable VALUES (:p1, :p2)";
cmd.Parameters.Add(new SQLiteParameter("p1", "text"));
cmd.Parameters.Add(new SQLiteParameter("p2", new DateTime(2000, 1, 1)));
cmd.ExecuteNonQuery();
// this fails - parameterized INSERT did not write the expected value in the DateTime column
cmd.CommandText = "SELECT COUNT(*) FROM TestTable WHERE SomeDateTime = '2000-01-01'";
rowCount = Convert.ToInt32(cmd.ExecuteScalar());
Debug.Assert(rowCount == 1);
// this works
cmd.CommandText = "SELECT COUNT(*) FROM TestTable WHERE date(SomeDateTime) = '2000-01-01'";
rowCount = Convert.ToInt32(cmd.ExecuteScalar());
Debug.Assert(rowCount == 1);
}