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

时间:2011-02-07 18:39:33

标签: c# system.data.sqlite

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

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

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

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

3 个答案:

答案 0 :(得分:10)

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

在这种情况下,(int)是演员,而不是转换。如果reader[]没有返回integer类型的对象,如果它返回不同的数字类型,则无论其包含的值如何,都将获得强制转换异常。

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

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

答案 1 :(得分:2)

发生异常是因为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,但会在objectAobjectB的演员表上抛出异常。这是.NET的一个特性,与ODBC驱动程序无关。

答案 2 :(得分:0)

SQLite的   http://www.sqlite.org/datatype3.html   整数。该值是有符号整数,存储为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整数值会出现溢出或超出范围的错误。