Dapper Sqlite问题纪录

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了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容