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;
}