美文网首页
Dapper Sqlite问题纪录

Dapper Sqlite问题纪录

作者: 108k | 来源:发表于2021-02-22 15:04 被阅读0次

0、database is locked database is locked

程序报这个异常,是因为外部程序也同时操作数据库文件引起的。

是由于DB browser删除数据记录后没有提交(写入更改),点击“写入更改”按钮后就ok了。

1、类空的构造函数定义

如果没有空的类构造函数定义,调用QueryIn时会出现以下异常:

System.InvalidOperationException:“A parameterless default constructor or one matching signature (System.Int64 Id, System.String Date, System.String Name) is required for Apple.Orm.Rlog materialization”

调用语句如下:

// QueryIn操作

    public List<Rlog> QueryIn(int[] ids)

    {

      using (var conn = new SQLiteConnection(connStr))

      {

        var query = conn.Query<Rlog>("select * from Rlog where id in @ids", new { ids }).ToList();

        return query.ToList();

      }

    }

解决:在类中,定义空的构造函数即可,原因:Dapper 在new时,使用的是空的构造函数。

public class Rlog

  {

    public int Id { get; set; }

    public string Date { get; set; } // 日期时间

    public string Name { get; set; } // 内容

    //public Rlog()

    //{

    //}

    public Rlog(string text)

    {

      Date = DateTime.Now.ToString("G");

      Name = text;

    }

  }

2、数据库文件的路径问题

需要手工创建目录。否则会报错。例如下面的dbPath中如果有路径的话,就要手工先创建。

public void InitSQLiteDb()

    {

      //数据库存在则跳过

      if (System.IO.File.Exists(dbPath))

      {

        return;

      }

      // 数据库如果不存在,就把那些表都先建立了

      using (var conn = new SQLiteConnection(connStr))

      {

        conn.Execute(@"

            CREATE TABLE Rlog (

            Id INTEGER PRIMARY KEY AUTOINCREMENT,

            Date TEXT NOT NULL,

            Name TEXT NOT NULL

            )");

      }

    }

3、数据库表定义与类的定义不符时,会抛出这个异常“NOT NULL constraint failed”

System.Data.SQLite.SQLiteException:“constraint failed

NOT NULL constraint failed: Rlog.ReCount”

在语句: var result = conn.Execute("Insert into Rlog(Date,Name) values (@Date, @Name)", rrs);中。

原因:定义不符,例如下面

conn.Execute(@"

            CREATE TABLE Rlog (

            Id INTEGER PRIMARY KEY AUTOINCREMENT,

            Date TEXT NOT NULL,

            ReCount TEXT NOT NULL,

其中ReCount定义为Text NOT NULL

而在类中定义为INT

public class Rlog

  {

    public int Id { get; set; }

    public string Date { get; set; } // 日期时间

    public int ReCount { get; set; } // 重复次数

解决:

定义成一致的,并且保证为not null就ok了

相关文章

网友评论

      本文标题:Dapper Sqlite问题纪录

      本文链接:https://www.haomeiwen.com/subject/rxxkfltx.html