使用SQLite数据库创建AutoIncrement附近的语法错误

时间:2014-07-06 21:13:52

标签: primary-key sqlite-net

再一次,我是那个使用SQLite-net的人。当我在表的主键上没有AutoIncrement时,我的代码工作正常。我想自动增加键,所以我重建了这样的表:

using SQLite;

namespace VehicleTracks.Models
{
    public class vehicles
    {
        [PrimaryKey, AutoIncrement]
        public int ID { get; set; }
        public string VehID { get; set; }
        public string VehYear { get; set; }
        public string VehMake { get; set; }
        public string VehModel { get; set; }
        public string VehColor { get; set; }
        public string EngineID { get; set; }
        public System.DateTime PurchaseDate { get; set; }
        public string SellerName { get; set; }
        public string SellerStreet { get; set; }
        public string SellerCityStateZip { get; set; }
        public string VehOptions { get; set; }
        public string OdomInitial { get; set; }
        public string VehBodyStyle { get; set; }
        public float PurchaseCost { get; set; }
        public byte[] VehPhoto { get; set; }
        public string VehType { get; set; }
        public string Sold { get; set; }
    }
}

现在,当尝试创建表时,我得到" AutoIncrement"附近的语法错误。我尝试不使用AutoIncrement,如果没有它,它似乎没有增加ID。

我可能错过了一些愚蠢的东西。

3 个答案:

答案 0 :(得分:4)

你的代码没什么愚蠢的;匹配https://github.com/praeclarum/sqlite-net上的代码示例。但显然代码示例是错误的,考虑到这个类似的问题:

Android table creation Failure (near "autoincrement": syntax error)?

通过删除AutoIncrement解决了该问题。或引用http://www.sqlite.org/faq.html#q1

  

简答:声明为INTEGER PRIMARY KEY的列会自动增量。

(请在创建表格后仔细检查列ID是否确实具有类型INTEGER PRIMARY KEY。)

  

更长的答案:如果将一个表的列声明为INTEGER PRIMARY KEY,那么无论何时在表的该列中插入NULL,NULL都会自动转换为一个大于最大值的整数。该列中所有其他行的列,如果表为空,则为1。

确保INSERT语句不包含列NULL的显式值(ID除外),否则该列不会自动递增。如果在SQLite-net中不可能(这里你可能需要一个调试器),那么这可能是一个bug。虽然没有其他人遇到这种情况会令人感到意外。

也许您需要使属性ID可以为空(即使用类型int?;是的,使用问号)。请注意,我只是在这里猜测;你可能需要试验一下。

答案 1 :(得分:0)

sqlite> CREATE TABLE app (a INTEGER PRIMARY KEY NOT NULL, B VARCHAR);
sqlite> insert into app (b) values ('');
sqlite> insert into app (b) values ('a');
sqlite> 
sqlite> insert into app (b) values ('b');
sqlite> insert into app (b) values ('c');
sqlite> insert into app (b) values ('d');
sqlite> select * from app;
1|
2|a
3|b
4|c
5|d
sqlite> exit;

注意:建议不要使用IN SQLite AUTOINCREMENT关键字。您需要使用INTEGER PRIMARY KEY NOT NULL。它将自动插入此属性的递增值。

答案 2 :(得分:0)

我是sqlite-net(https://github.com/praeclarum/sqlite-net)的新手,并且遇到了自动增量PK的问题。

虽然我使用INTEGER PRIMARY KEY或INTEGER PRIMARY KEY AUTOINCREMENT创建了表,但我在插入时遇到了异常,因为PK在第一行中设置为0然后我得到了异常,因为它试图插入相同的值,所以自动增量不起作用。我所做的是编辑DataAccess.cs,在表类中我已经替换了[PrimaryKey] public Int64 id {get;组; for [PrimaryKey] [AutoIncrement] public Int32 id {get;组; }。我不知道为什么它使用bigint(Int64)而不是Int32,因为我在表创建中指定了INTEGER,但现在它工作正常。我可以通过LINQ添加一个新项目,自动增量id(表的主键)在每一行自动递增。