问题标题不清楚,但是我的以下描述非常清楚这个问题:
我在CREATE TABLE查询中将一个字段声明为datetime,我调用此字段BirthDay
,如果我有以下查询并填写如下的DataTable:
SQLiteDataAdapter da = new SQLiteDataAdapter("SELECT BirthDay FROM myTable", myConnection);
DataTable dt = new DataTable();
da.Fill(dt);
myDataGridView.DataSource = dt;
BirthDay
的{{1}}列的类型为myDataGridView
,我可以通过DateTime
进行检查。
但是,如果我更改SELECT查询有点像这样:
myDataGridView.Columns["BirthDay"].ValueType
在填写我的DataTable并绑定到myDataGridView之后,我预计SQLiteDataAdapter da = new SQLiteDataAdapter("SELECT CASE WHEN 1 THEN BirthDay END AS BirthDay2 FROM myTable", myConnection);
列也是BirthDay2
的类型。但是类型是DateTime
?
我尝试使用System.Object
,但返回的类型是CAST(... as DATETIME)
(我知道SQLite中的DATETIME实际上对应于.NET中的System.Int64
),我想知道我是如何制作的它会将Int64
作为原始列System.DateTime
返回。
我需要最终类型(可通过BirthDay
检查)DataGridViewColumn.ValueType
,以便我可以使用DateTime
格式化我的日期时间字符串。
非常感谢您的帮助!
答案 0 :(得分:0)
我们的工作团队长期以来一直在研究这个问题。我们的最终结论是,任何表达式包装源字段都会使源数据类型不可用。对于使用表达式的ADO.NET提供程序,导致System.Object
最终类型,对于ODBC提供程序,它会导致System.String
类型。所以它完全取决于您使用的数据提供者。为什么它以这种方式运行是数据提供者开发人员的问题(我还没有找到答案)。
顺便说一句,.NET Framework提供了各种工具来测试给定值是否为预期类型。 SQLite 3中只有5种基本数据类型(NULL,INTEGER,REAL,TEXT,BLOB)。因此,在.NET代码中,您可以通过测试将值传递给3种最常见的类型(INTEGER,REAL,TEXT)。