【问题标题】:When i select from sqlite column of type 'int' I can cast to .net int but when I select from 'integer' column I cannot当我从'int'类型的sqlite列中选择时,我可以转换为.net int,但是当我从'integer'列中选择时,我不能
【发布时间】:2011-06-22 22:38:56
【问题描述】:

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

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

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

有人知道这是否是预期的行为吗?

【问题讨论】:

    标签: c# system.data.sqlite


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 在发现long x = (long)reader["myColumn"]; 确实可以正常工作后,我只是回到这个问题自己来回答这个问题。你是绝对正确的——它是一个 Int64——所以只使用长变量对我有用。至于为什么 INT 和 INTEGER 的行为不同,这对我来说仍然很奇怪。对于表中的相同数据值,我可以重复从 INT/INTEGER 转换的成功/失败,并且也可以在另一个表中复制问题。大概只是驱动程序中的轻微不一致。
    【解决方案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 驱动程序无关。

    【讨论】:

      【解决方案3】:

      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 整数 -2,147,483,648 .. 2,147,483,647

      所以我预计“大”SQlite 整数值会出现溢出或超出范围错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-20
        • 1970-01-01
        • 2023-03-28
        • 2018-12-19
        • 2012-07-18
        • 1970-01-01
        • 1970-01-01
        • 2018-03-06
        相关资源
        最近更新 更多