当我从’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,但会在objectA
, objectB
的objectA
抛出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整数值会出现溢出或超出范围的错误。