创建SQLite数据库时出现AutoIncrement语法错误



又是我,用SQLite-net工作的家伙。当我在表的主键上没有自动增量时,我的代码工作了。我想要自动增加键,所以我像这样重建表:

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没有它。

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

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

Android表创建失败(附近"autoincrement":语法错误)?

通过删除自动增量解决了问题。或者引用http://www.sqlite.org/faq.html#q1:

简短的回答:声明为INTEGER PRIMARY KEY的列将自动递增。

(请在创建表后再次检查列ID是否实际上具有INTEGER PRIMARY KEY类型)

长一点的回答:如果你声明一个表的列是INTEGER PRIMARY KEY,那么当你在这个表的列中插入一个NULL时,NULL会自动转换成一个整数,这个整数比该列在表中所有行的最大值大1,如果这个表是空的,则为1。

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

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

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。它将自动为该属性插入增量值。

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

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

最新更新