代码之家  ›  专栏  ›  技术社区  ›  Léo D.

如何区分sqlite网络中的NULL数据和0?

  •  1
  • Léo D.  · 技术社区  · 10 年前

    我正在使用开发iOS应用程序 Xamarin 。我正在使用sqlite net ORM与数据库交互。

    对于Integer列,ORM返回一个 Int32 价值但是,此列中的值可以是 NULL 。我注意到如果是这种情况,它将返回0而不是 无效的 因为无法将int设置为 无效的 .

    例如,使用以下代码:

    public class Client
    {
        public Client ()
        {
        }
    
        [PrimaryKey, Column("ID")]
        public string ID{ get; set;}
    
        public string FirstName{ get; set;}
        public string LastName{ get; set;}
        public int    Age{ get; set;}
    }
    

    如果ID正确,但FirstName、LastName和Age设置为 无效的 ,返回的对象在FirstName和LastName字段中将为null,这是合乎逻辑的。但年龄将设置为零。 所以我不知道这个值是不是 无效的 或者真的是0。有没有办法区分这些情况?

    1 回复  |  直到 10 年前
        1
  •  3
  •   James Russo    10 年前

    理想情况下,您的Client类告诉我们“Age”是不可为空的属性。但这里重要的是要认识到,“年龄”是一个整数,实际上是一个值类型。

    值类型不能包含null值。除非与“?”组合或“可为空”正如已经指出的那样。

    在.NET中,字符串实际上不是值类型,而是引用类型。

    因此,这就是为什么您在字符串属性上获得空值,而在整数属性上没有。

    另一件需要注意的事情是SQLite。NET默认创建可为Null的列,为了强制非Null列,需要在属性上方添加属性:[NotNullAttribute]。

    允许“Age”作为空值从数据库返回的唯一原因是写入以下属性:

    public class Client
    {
    public Client ()
    {
    }
    
    public Nullable<int> Age{ get; set;}
    //public int? Age { get; set; }
    }