首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >插入AutoIncrement

插入AutoIncrement
EN

Stack Overflow用户
提问于 2016-05-11 10:04:53
回答 2查看 2.4K关注 0票数 5

我正在尝试将一些数据插入到我的SQLite数据库中,当我用一条记录完成这一工作时,这个数据库就能很好地工作。但是在一个循环中,我得到了一个错误。首先,这是代码

代码语言:javascript
复制
string dataSource = "Data Source=";
Connection = new SQLiteConnection(dataSource + this.DatabasePath);

var context = new DataContext(Connection);

var users = context.GetTable<User>();


for (int i = 0; i < 2; i++) {
    User tempUser = new User() {
        ID = null,
        EMail = i + "@" + i + ".de",
        Password = "Test1234",
        JoinedDate = DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss")
    };

    users.InsertOnSubmit(tempUser);
    context.SubmitChanges();
}

和用户本身

代码语言:javascript
复制
[Table(Name = "User")]
public class User {

    [Column(Name = "UserID", IsPrimaryKey = true, CanBeNull = false)]
    public int? ID { get; set; }

    [Column(Name = "EMail", CanBeNull = false)]
    public string EMail { get; set; }

    [Column(Name = "Password", CanBeNull = false)]
    public string Password { get; set; }

    [Column(Name = "JoinedDate", CanBeNull = false)]
    public String JoinedDate { get; set; }

    [Column(Name = "PaymentMethodID")]
    public int PaymentMethodID { get; set; }
}

表是这样创建的

代码语言:javascript
复制
CREATE TABLE "User" (
`UserID`    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
`EMail` TEXT NOT NULL,
`Password`  TEXT NOT NULL,
`JoinedDate`    TEXT NOT NULL,
`Licenses`  INTEGER,
`PaymentMethodID`   INTEGER
)

最后,我得到的错误是:

“System.Data.Linq.DuplicateKeyException”类型的异常发生在System.Data.Linq.dll中,但未在用户代码中处理 补充资料: Eine Entit t,deren Schlüssel bereits verwendet,kann nicht hinzugefügt werden。

我可以打赌,这是因为字段ID,它被设置为AutoIncrement

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-11 12:24:46

假设您的代码在一次插入时运行良好,我将尝试以下解决方案之一。

解决方案1

在循环外调用context.SubmitChanges();

所以

代码语言:javascript
复制
for (int i = 0; i < 2; i++) {
    User tempUser = new User() {
        ID = null,
        EMail = i + "@" + i + ".de",
        Password = "Test1234",
        JoinedDate = DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss")
    };

    users.InsertOnSubmit(tempUser);

}
context.SubmitChanges();

解决方案2

使用InsertAllOnSubmit

代码语言:javascript
复制
var tempUsers = Enumerable.Range(0, 2)
                      .Select(i => new User{
                                   ID = null,
                                   EMail = i + "@" + i + ".de",
                                   Password = "Test1234",
                                   JoinedDate = DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss")
                      });

users.InsertAllOnSubmit(tempUsers);
context.SubmitChanges();

解决方案3

在每个循环中处理和重新创建上下文(似乎是个很糟糕的主意)

代码语言:javascript
复制
for (int i = 0; i < 2; i++) {
   using (var context = new DataContext(Connection)) {
     var users = context.GetTable<User>();

     User tempUser = new User() {

        ID = null,
        EMail = i + "@" + i + ".de",
        Password = "Test1234",
        JoinedDate = DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss")
    };

     users.InsertOnSubmit(tempUser);
     context.SubmitChanges();
   }
}
票数 0
EN

Stack Overflow用户

发布于 2016-05-11 11:50:11

您只需删除ID = null,因为这是自动增量,不需要写这个。Alter "User“删除自动增量列ID中的NULL检查,并在类"User”中删除。ID列是自动增量,然后不需要使用NULL约束进行检查。

代码语言:javascript
复制
for (int i = 0; i < 2; i++) {
    User tempUser = new User() {
        EMail = i + "@" + i + ".de",
        Password = "Test1234",
        JoinedDate = DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss")
    };
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37159299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档