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了
网友评论