我正在使用 System.Data.SQLite,从列类型为“整数”的 sqlite 数据库表中进行选择,并且当我执行以下操作时:
int x = (int)reader["myColumn"];
它失败。问题不在于该值为空;该列不可为空。如果我将列的数据类型更改为“int”,那么它工作正常。列中的值为'2'、'3'、'4'等;没什么大不了的。
任何人都知道这是否是预期的行为?
我正在使用 System.Data.SQLite,从列类型为“整数”的 sqlite 数据库表中进行选择,并且当我执行以下操作时:
int x = (int)reader["myColumn"];
它失败。问题不在于该值为空;该列不可为空。如果我将列的数据类型更改为“int”,那么它工作正常。列中的值为'2'、'3'、'4'等;没什么大不了的。
任何人都知道这是否是预期的行为?
正如另一个回答者提到的,SQLite 整数存储在 1、2、3、4、6 或 8 个字节中。但是,您不会遇到溢出或超出范围的异常。
在这种情况下,(int)
是转换,而不是转换。如果reader[]
没有返回整数类型的对象,如果它返回不同的数字类型,则无论它包含什么值,您都会得到一个强制转换异常。
根据 SQLite 整数的有效值范围,我猜它会将值作为 64 位整数返回,long
. 要验证,请尝试以下操作:
object x = reader["myColumn"];
Debug.WriteLine(x.GetType().Name);
发生异常是因为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);
objectA
控制台输出 2 然后 1,但会在 , 的演员表上抛出异常objectB
。这是 .NET 的一个特性,与 ODBC 驱动程序无关。
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 整数值会出现溢出或超出范围错误。