C# SQLite

SQLiteConnection对象初始化、打开及关闭,其花费时间约为109ms,因此,最好不要频繁地将该对象初始化、打开与关闭
无论是执行插入或查询操作,使用事务比不使用事务快,尤其是在批量插入操作时,减少得时间非常明显
不能每次执行一条SQL语句前开始事务并在SQL语句执行之后提交事务,这样的执行效率同样是很慢,最好的情况下,是在开始事务后批量执行SQL语句,再提交事务,这样的效率是最高的。

SQLiteConnection connection = Run(() => new SQLiteConnection("Data Source = /DB/Test.db"), "连接对象初始化");

Run(() => connection.Open(), "打开连接");

SQLiteCommand command = Run(() => new SQLiteCommand(connection), "命令对象初始化");

#region  执行DELETE命令及收缩数据库  目前收缩数据库有问题
//Run(() =>
//{
//    //command.CommandText = $"DELETE FROM Info;VACUUM;UPDATE sqlite_sequence SET seq ='0' where name ='Info';";
//    command.CommandText = $"DELETE FROM Info;";
//    command.ExecuteNonQuery();
//}, "执行DELETE命令及收缩数据库");
#endregion

#region [---不使用事务---]事务执行INSERT命令
//Run(() =>
//{
//    try
//    {
//        //'A{i:000}'  保留几位数
//        for (int i = 0; i < 1000; i++)
//        {
//            command.CommandText = $"INSERT INTO Info(Name, Age) VALUES ('A{i:000}','{i}')";
//            command.ExecuteNonQuery();
//        }
//        command.ExecuteScalar();
//    }
//    catch (Exception ex)
//    {

//    }
//    finally
//    {

//    }
//}, "[---使用事务---]事务执行INSERT命令");
#endregion

#region  [---不使用事务---]使用ExecuteReader方式执行SELECT命令
//List<Test> list1 = Run(() =>
//{
//    command.CommandText = $"SELECT * FROM Info";
//    List<Test> tests = new List<Test>();
//    SQLiteDataReader reader = command.ExecuteReader();
//    while (reader.Read())
//    {
//        Test t = new Test
//        {
//            Name = (string)reader[0],
//            Age = (string)reader[1]
//        };
//        tests.Add(t);
//    }
//    reader.Close();
//    return tests;
//}, "[---不使用事务---]使用ExecuteReader方式执行SELECT命令");
#endregion

#region [---不使用事务---]使用Fill Table方式执行SELECT命令
//DataTable table1 = Run(() =>
//{
//    command.CommandText = $"SELECT * FROM Info";
//    SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
//    DataTable _table = new DataTable();
//    adapter.Fill(_table);
//    return _table;
//}, "[---不使用事务---]使用Fill Table方式执行SELECT命令");
#endregion

#region  执行DELETE命令及收缩数据库 目前收缩数据库有问题
//sqlite_sequence表也是SQLite的系统表。该表用来保存其他表的RowID的最大值。数据库被创建时,sqlite_sequence表会被自动创建。
//该表包括两列。第一列为name,用来存储表的名称。第二列为seq,用来保存表对应的RowID的最大值。该值最大值为9223372036854775807。
//当对应的表增加记录,该表会自动更新。当表删除,该表对应的记录也会自动删除。如果该值超过最大值,会引起SQL_FULL错误。所以,
//一旦发现该错误,用户不仅要检查SQLite文件所在的磁盘空间是否不足,还需要检查是否有表的ROWID达到最大值。
Run(() =>
{
    //sqlite3 收缩数据库命令vacuum
    //INSERT INTO Info(Name, Age) VALUES ('A1000','1')
    //command.CommandText = $"DELETE FROM Info;VACUUM;UPDATE sqlite_sequence SET seq ='0' where name ='Info';";
//无法执行UPDATE sqlite_sequence SET seq ='0' where name ='Info' 会提示没有找到该表
    command.CommandText = $"DELETE FROM Info;VACUUM;";
    command.ExecuteNonQuery();
}, "执行DELETE命令及收缩数据库");
#endregion

#region [---使用事务---]执行INSERT命令
SQLiteTransaction transaction = Run(() => connection.BeginTransaction(), "开始事务");
Run(() =>
{
    for (int i = 0; i < 3000; i++)
    {
        command.CommandText = $"INSERT INTO Info(Name, Age) VALUES ('A{i:0000}','{i}')";
        command.ExecuteNonQuery();
    }
    var result = command.ExecuteScalar();
}, "[---使用事务---]执行INSERT命令");
#endregion

#region  [---使用事务---]使用ExecuteReader方式执行SELECT命令
List<Test> list2 = Run(() =>
{
    command.CommandText = $"SELECT * FROM Info";
    List<Test> tests = new List<Test>();
    SQLiteDataReader reader = command.ExecuteReader();
    while (reader.Read())
    {
        Test t = new Test
        {
            Name = (string)reader[0],
            Age = (string)reader[1]
        };
        tests.Add(t);
    }
    reader.Close();
    return tests;
}, "[---使用事务---]使用ExecuteReader方式执行SELECT命令");
#endregion

#region [---使用事务---]使用Fill Table方式执行SELECT命令
DataTable table2 = Run(() =>
{
    command.CommandText = $"SELECT * FROM Info";
    SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
    DataTable _table = new DataTable();
    adapter.Fill(_table);
    return _table;
}, "[---使用事务---]使用Fill Table方式执行SELECT命令");
#endregion

Run(() => transaction.Commit(), "提交事务");

Run(() => connection.Close(), "关闭连接");
public static void Run(Action action, string description)
{
    Stopwatch sw = Stopwatch.StartNew();
    action();
    Console.WriteLine($"--> {description}: {sw.ElapsedMilliseconds}ms");
}

public static T Run<T>(Func<T> func, string description)
{
    Stopwatch sw = Stopwatch.StartNew();
    T result = func();
    Console.WriteLine($"--> {description}: {sw.ElapsedMilliseconds}ms");
    return result;
}
posted @ 2019-12-17 15:44  游不动  阅读(1358)  评论(0编辑  收藏  举报