8

我正在使用 System.Data.SQLite,从列类型为“整数”的 sqlite 数据库表中进行选择,并且当我执行以下操作时:

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

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

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

4

3 回答 3

10

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

在这种情况下,(int)是转换,而不是转换。如果reader[]没有返回整数类型的对象,如果它返回不同的数字类型,则无论它包含什么值,您都会得到一个强制转换异常。

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

object x = reader["myColumn"];
Debug.WriteLine(x.GetType().Name);
于 2011-02-07T21:58:27.203 回答
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); 

objectA控制台输出 2 然后 1,但会在 , 的演员表上抛出异常objectB。这是 .NET 的一个特性,与 ODBC 驱动程序无关。

于 2011-03-22T05:04:08.577 回答
1

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 整数值会出现溢出或超出范围错误。

于 2011-02-07T18:50:46.487 回答