繁体   English   中英

我如何附加一个新的 id 来记录

[英]How do I append a new id to record

我有一个问题,基本上我希望数据库中的 id 自动递增并添加更多用户,但是当我尝试添加第二条记录时,它会抛出一个错误,例如:

constraint failed
Unique constraint failed: DANE.id

这是我的插入方法:

 private void LoadToDb_Click(object sender, EventArgs e)
        {
            var modelData = new Data();
            var db = new SqlDb();
            var sqLiteConnection = db.Connect();
            var sqLiteCommand = sqLiteConnection.CreateCommand();

            try
            {
                modelData.Name = firstName.Text;
                modelData.Age = Convert.ToInt32(DisplayAge.Text);
                modelData.LastName = LastName.Text;

                sqLiteCommand.CommandText =
                    $"insert into DANE values('{modelData.Name}', '{modelData.LastName}', '{modelData.Age}', {Interlocked.Increment(ref modelData.Id)})";
                sqLiteCommand.ExecuteNonQuery();

                db.Disconnect();
            }
            catch (Exception exception)
            {
                MessageBox.Show(exception.Message);
            }
        }

这是我的数据模型

    public class Data
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }
        public int id = 0;
    }

这是 sqLite 数据库模式(我为此使用 db 浏览器)

CREATE TABLE "DANE" (
    "FirstName" TEXT NOT NULL,
    "LastName"  TEXT NOT NULL,
    "Age"   INTEGER NOT NULL,
    "id"    INTEGER NOT NULL,
    PRIMARY KEY("id" AUTOINCREMENT)
);

您使用 Data.Id 作为主键,但每次都创建一个新实例。 因此,您的主键将始终为 1(创建新实例后立即为 0,然后在调用 Interlocked.Increment 时为 1,顺便说一句,可能不需要)。

此外,您正在代码和数据库中生成主键。 选择您喜欢的一种,无需特意去做。

您的表定义为"id" INTEGER NOT NULL, PRIMARY KEY("id" AUTOINCREMENT)

所以,你的插入需要像

$"insert into DANE (FirstName, LastName, Age) 
  values('{modelData.Name}', '{modelData.LastName}', '{modelData.Age}')";

基本上,您不会在INSERT列出自动增量列。 但是您需要根据 SqlLite 特定的数据库语法和提供程序功能检索插入的记录值。 每个数据库引擎及其 .NET 提供程序都有自己的方法。

这应该可以帮助你

提示: SQLiteConnection.LastInsertRowId

像这样定义表格:

CREATE TABLE "DANE" (`enter code here`
     "id"    INTEGER NOT NULL AUTO_INCREMENT,
    "FirstName" TEXT NOT NULL,
    "LastName"  TEXT NOT NULL,
    "Age"   INTEGER NOT NULL,
);

或者

var NewID =  DB.DANE.Max(x => x.id) + 1;

然后在插入查询中添加 NewID 作为 id。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM