自动递增主键的SQLite表

时间:2015-03-10 12:39:23

标签: c# sqlite

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

(不自动递增主键)

表格创建:

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. 尝试插入时,我收到了非null异常错误。

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

    先谢谢你们。

4 个答案:

答案 0 :(得分:5)

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

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

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

另请参阅:ROWIDs and the INTEGER PRIMARY KEY

答案 1 :(得分:3)

您可以创建一个表示数据库表的类,并在数据库中添加该表。

创建表类

[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>();

答案 2 :(得分:1)

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

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

信不信由你只是说INT(我不太清楚为什么会这样)。

编辑:我试过这个,我能够重现这个问题,指定INTEGER按预期工作。

答案 3 :(得分:-1)

检查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?在上述相同的常见问题解答中。