【问题标题】:SQLite Table That Auto Increments Primary Key自动递增主键的 SQLite 表
【发布时间】:2015-05-11 21:45:57
【问题描述】:

主要问题是我在尝试插入数据条目时出错。

(不自动递增主键)

表创建:

SQLiteConnection _sqliteCon = new SQLiteConnection(_connectStr);
_sqliteCon.Open();

string query5 = "CREATE TABLE Merkmal(MerkmalID INT PRIMARY KEY NOT NULL, ";
        query5 += "MerkmalName_FR TEXT);";
        SQLiteCommand command5 = new SQLiteCommand(query5, _sqliteCon);
        command5.ExecuteNonQuery();
        _sqliteCon.Close();

这似乎工作正常。

现在插入: (我认为这是我的错误发生的地方

SQLiteConnection _sqliteCon = new SQLiteConnection(_connectStr);
_sqliteCon.Open();
SQLiteCommand insertSQL = new SQLiteCommand("INSERT INTO Merkmal(MerkmalID,MerkmalName_FR) VALUES (?,?)",_sqliteCon);
insertSQL.Parameters.Add(new SQLiteParameter("param1",null));
insertSQL.Parameters.Add(new SQLiteParameter("param2",SomeString));
insertSQL.ExecuteNonQuery();
_sqliteCon.Close();

一些值得注意的事情:

  1. 我试图完全不设置值。 (使用硬编码值)

  2. 尝试插入时出现非空异常错误。

创建或插入表以自动递增主键的正确方法是什么

在此先感谢各位。

【问题讨论】:

    标签: c# sqlite


    【解决方案1】:

    MerkmalID INT PRIMARY KEY NOT NULL 更改为MerkmalID INTEGER PRIMARY KEY

    SQLite 中的大多数表都有一个rowid 列(也别名为oid_rowid_)。通过将列声明为INTEGER PRIMARY KEY(但不是INTBIGINT 等,即使它们引用相同的类型),该列将成为rowid 的别名。

    当您插入一行省略或 NULL rowid 时,SQLite 会为您选择一个唯一 ID。

    另请参阅:ROWIDs and the INTEGER PRIMARY KEY

    【讨论】:

    • 要试一试。谢谢。
    【解决方案2】:

    您可以创建一个代表您的数据库表的类并将该表添加到您的数据库中。

    创建表格类

    [Table("WordT")]
    public class WordT
    {
    
        private int _WId;
        [Column("WId")]
        [PrimaryKey]
        [NotNull]
        [AutoIncrement]
        public int WId
        {
            get { return _WId; }
            set
            {
                if (_WId != value)
                {
                    _WId = value;
                }
            }
        }
    
        private string _Word;
    
        [Column("Word")]
        public string Word
        {
            get { return _Word; }
            set
            {
                if (_Word != value)
                {
                    _Word = value;
                }
            }
        }
       }
    

    在你的数据库中添加表

     SQLiteConnection c = new SQLiteConnection(pth);
     var t = c.CreateTable<WordT>();
    

    【讨论】:

    • 有趣的做法,以后会参考这个!
    • 有趣!您将如何创建非 int 或 varchar 列主键,以便我们没有重复值?
    【解决方案3】:

    您的问题是 INT 关键字。请改用 INTEGER,它会按预期工作。

    所以,正确的代码是:CREATE TABLE Merkmal(MerkmalID INTEGER PRIMARY KEY NOT NOT NULL ...

    信不信由你,这与仅仅说INT 不同(我不太清楚为什么会这样)。

    编辑:我已经尝试过了,我能够重现问题,指定 INTEGER 按预期工作。

    【讨论】:

      【解决方案4】:

      查看 SQLite 常见问题解答中的 How do I create an AUTOINCREMENT field?。声明为 INTEGER PRIMARY KEY 的列将自动递增。在您的情况下,您将定义您的 PK 列,如:

      MerkmalID INT PRIMARY KEY
      

      并像这样插入它:

      INSERT INTO Merkmal VALUES (NULL,'SAMPLE MerkmalName')
      

      您还希望将参照完整性包含在您的连接字符串中:

      string connectionString = 
          String.Format(@"Data Source={0};Foreign Keys=ON", dataDataAccessPath);
      

      "PRAGMA foreign_keys = ON;" 用于每个打开的连接。

      更多详情请点击此处:Does SQLite support foreign keys? 在上述相同的常见问题解答中。

      【讨论】:

      • 插入您建议的方式不起作用。只是在 ID 字段中获取空值。没有自动增量。好吧,我刚刚提到了你的文章。是的,你的答案是完美的。但仍然......不工作。
      猜你喜欢
      • 2011-03-18
      • 1970-01-01
      • 2013-04-06
      • 2012-01-21
      • 2013-04-18
      • 2013-09-28
      • 2017-02-10
      • 1970-01-01
      相关资源
      最近更新 更多