SQLite SELECT查询中的自定义字段填充后不会成为数据表中的DATETIME列

3yhwsihp  于 2022-11-14  发布在  SQLite
关注(0)|答案(1)|浏览(143)

我有一个在CREATE TABLE查询中声明为DATETIME的字段,如果我有以下查询并像这样填充DataTable,我将该字段称为BirthDay

SQLiteDataAdapter da = new SQLiteDataAdapter("SELECT BirthDay FROM myTable", myConnection);
DataTable dt = new DataTable();
da.Fill(dt);
myDataGridView.DataSource = dt;

myDataGridView的列BirthDay的类型为DateTime,我可以通过myDataGridView.Columns["BirthDay"].ValueType进行检查。
但是,如果我稍微更改SELECT查询,如下所示:

SQLiteDataAdapter da = new SQLiteDataAdapter("SELECT CASE WHEN 1 THEN BirthDay END AS BirthDay2 FROM myTable", myConnection);

在填写了我的数据表并绑定到myDataGridView之后,我以为BirthDay2列也是DateTime类型。但是类型是System.Object
我试过使用CAST(... as DATETIME),但返回的类型是System.Int64(我知道SQLite中的DateTime实际上对应于.NET中的Int64),我想知道如何才能让它返回System.DateTime作为原始列BirthDay
我需要最后的类型(可以通过DataGridViewColumn.ValueType检查)是DateTime,这样我就可以使用DataGridViewColumn.Format将我的日期时间字符串格式化为我想要的格式。

vwhgwdsa

vwhgwdsa1#

我们在工作中的团队已经研究这个问题很长时间了。我们的最终结论是,任何 Package 源字段的表达式都会使源数据类型不可用。对于ADO.NET提供程序,使用表达式会导致System.Object最终类型,对于ODBC提供程序,它会导致System.String类型。因此,这完全取决于您使用的数据提供程序。对于数据提供商开发人员来说,为什么会有这样的行为是一个问题(我还没有找到答案)。顺便说一句,.NET框架提供了各种工具来测试给定值是否为预期类型。SQLite 3中只有5种基本数据类型(NULL、INTEGER、REAL、TEXT、BLOB)。因此,在.NET代码中,您可以通过测试3种最常见的类型(整数、实数、文本)来传递您的值。

相关问题