C# 在SQLite(C)中,当我合并两个表时,我会丢失列类型信息

C# 在SQLite(C)中,当我合并两个表时,我会丢失列类型信息,c#,sqlite,C#,Sqlite,在下面的代码中,当我从单个表执行查询时,类型信息是完美的。。。但是,当我从两个定义相同的表的并集执行查询时。。。类型信息丢失的程度如下: Select * from Test1 Name (System.String) Date (System.DateTime) Value (System.Int32) Select * from Test1 UNION Select * from Test2 Name (System.String) Date (System.String) <==

在下面的代码中,当我从单个表执行查询时,类型信息是完美的。。。但是,当我从两个定义相同的表的并集执行查询时。。。类型信息丢失的程度如下:

Select * from Test1
Name (System.String)
Date (System.DateTime)
Value (System.Int32)

Select * from Test1 UNION Select * from Test2
Name (System.String)
Date (System.String)  <== DateTime converted to String
Value (System.Int64)  <== Int32 converted to Int64
我把它修好了

而是创建一个视图

  CREATE VIEW "vwTest" AS Select * from Test1 UNION Select * from Test2
然后您应该从视图中进行选择

  Select * from vwTest
据我所知,SQLite3中没有真正的数据类型,或者我应该说,没有常规的数据类型。它明确表示日期、日期时间和Bool都不存在

而是有存储类:

无效的该值为空值。 整数该值是有符号整数,根据值的大小存储在1、2、3、4、6或8字节中。 真实的该值是一个浮点值,存储为8字节IEEE浮点数。 文本该值是一个文本字符串,使用数据库编码UTF-8、UTF-16BE或UTF-16LE存储。 斑点。该值是一组数据,与输入时完全相同。 还有类型亲和力的概念 根据需要组织各种类和子类之间的转换

这很可能是SQLite内部或.NET接口在处理UNION语句的过程中进行转换的原因。 下面是文档中另一个有趣的引用:

SQLite没有为存储日期和/或时间而预留的存储类。相反,SQLite的内置日期和时间函数能够将日期和时间存储为文本、实数或整数值

看起来,在解析UNION的SELECT语句时,每个列都会转换为它以后可能会找到的最通用的子类:对于所有INT,它都将是INT64,这是显而易见的;日期是字符串,虽然不太明显,但仍然可信


由于您的表是相同的,而且您的值也几乎相同,因此这似乎是一项必须遵守的规定,除非不同的接口会有不同的操作方式。

如果您从选择*更改为选择名称、日期、值,这有帮助吗?据我所知,SQLite数据库中列的类型是从列中的数据推断出来的。这意味着第二个表中的数据阻止SQLite推断出一种常见类型。@idursun,如果你看一下我提供的代码,我插入的数据是正确的类型。@DavidG,这无助于我理解你说的话,也无助于我过去经历过的事情,尤其是日期,这就是为什么当C SQLite为我如此出色地转换日期时,我感到如此惊喜的原因。。。直到我建立了联盟!%
  Select * from vwTest