当我从’int’类型的sqlite列中选择时,我可以转换为.net int但是当我从’integer’列中选择时我不能

我正在使用System.Data.SQLite,从一个sqlite数据库表中选择一个列的类型为’integer’,当我做这样的事情时:

int x = (int)reader["myColumn"]; 

它失败。 问题不在于该值为空; 该列不可为空。 如果我将列的数据类型更改为“int”,那么它可以正常工作。 列中的值为“2”,“3”,“4”等; 没什么大不了的。

任何人都知道这是否是预期的行为?

正如另一个回答者所提到的,SQLite整数以1个,2个,3个,4个,6个或8个字节存储。 但是,您不会出现溢出或超出范围的exception。

在该上下文中, (int)是强制转换,而不是转换。 如果reader[]没有返回integer类型的对象,如果它返回不同的数字类型,则无论其包含的值如何,都将获得强制转换exception。

根据SQLite整数的有效值范围,我猜它是将值返回为64位整数, long 。 要validation,请尝试以下操作:

 object x = reader["myColumn"]; Debug.WriteLine(x.GetType().Name); 

发生exception是因为datareader.Item[]返回object

问题是由于装箱/拆箱。 这与数据库本身无关……

 long a = 1; int b = 2; object objectA = a; object objectB = b; Console.WriteLine((int)a); Console.WriteLine((long)b); Console.WriteLine((int)objectA); Console.WriteLine((long)objectB); 

控制台输出2然后输出1,但会在objectAobjectBobjectA抛出exception。 这是.NET的一个特性,与ODBC驱动程序无关。

SQLite http://www.sqlite.org/datatype3.html INTEGER。 该值是有符号整数,存储为1,2,3,4,6或8个字节,具体取决于值的大小。

.NET http://msdn.microsoft.com/en-us/library/cs7y5x0x(VS.90).aspx int -2,147,483,648 .. 2,147,483,647

所以我预计“大”SQlite整数值会出现溢出或超出范围的错误。