我正在使用System.Data.SQLite,从一个sqlite数据库表中选择一个列的类型为'integer',当我这样做时:
int x = (int)reader["myColumn"];
失败了。问题不在于该值为空;该列不可为空。如果我将列的数据类型更改为“int”,那么它可以正常工作。列中的值为“2”,“3”,“4”等;没什么大不了的。
任何人都知道这是否是预期的行为?
答案 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,但会在objectA
,objectB
的演员表上抛出异常。这是.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整数值会出现溢出或超出范围的错误。