Plant 2019-12-27
我的数据库 名字叫dic.db 和程序放在一起
CREATE TABLE [dic]( [ID] INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE ON CONFLICT REPLACE, [单词] TEXT UNIQUE ON CONFLICT REPLACE, [英式音标] TEXT COLLATE NOCASE, [美式音标] TEXT COLLATE NOCASE, [解释] TEXT);
所以拼出来的插入sql字符串应该是这样的
insert or replace into [dic] (单词,英式音标,美式音标,解释) values (‘zooks‘,‘[zu?ks]‘,‘[zu?ks]‘,‘用作温和誓愿的感叹短语;‘);
C#代码
//批量Insert Into
private void buttonInsertInto_Click(object sender, EventArgs e) {
sw.Reset();
sw.Start();
string ConnectionString = "Data Source = dic.db; Version=3;";
SqliteHelper sqlite = new SqliteHelper(ConnectionString);
sqlite.BatchExecuteCmd(richTextBox4.Lines);
sw.Stop();
MessageBox.Show("批量插入SQL语句耗时:" + ( sw.ElapsedMilliseconds / 1000f ).ToString("0.0000 sec"));
}
//纯替换
Stopwatch sw = new Stopwatch();
private void buttonReplace_Click(object sender, EventArgs e) {
sw.Start();
//用的是替换 速度是瞬间的 没有判断,先移除所有空行
//瞬间插入6万行 用替换的办法
//zookeeper ['zu?ki?p?(r)] ['zu?ki?p?r] n.动物园管理员;
//替换成这样
//insert or replace into [dic] (单词,英式音标,美式音标,解释)
//values (‘zookeeper‘,‘['zu?ki?p?(r)]‘,‘ ['zu?ki?p?r]‘,‘n.动物园管理员;‘);
string s = richTextBox4.Text;
//1/3最左边替换成 insert or replace into [dic] (单词,英式音标,美式音标,解释) values (‘
Regex r = new Regex("^", RegexOptions.Multiline);
s = r.Replace(s, "insert or replace into [dic] (单词,英式音标,美式音标,解释) values (‘");
//2/3 tab 替换成 ‘,‘ 下面的空格并不是空格而是复制的tab空格
r = new Regex(" ", RegexOptions.Multiline);
s = r.Replace(s, "‘,‘");
//3/3最右边替换成 ‘);
r = new Regex("$", RegexOptions.Multiline);
s = r.Replace(s, "‘);");
richTextBox4.Text = s;
sw.Stop();
MessageBox.Show( "替换耗时:" + ( sw.ElapsedMilliseconds / 1000f ).ToString("0.0000 sec"));
}61991行,光粘贴进来都用了2秒钟61991行光标替换了就用了7.8秒,如果用for的话 得小时级别的,得要6个小时、得要7个小时?
批量执行SQL命令只用了1.2秒
/// <summary>
/// 转换后的SQL格式语句,事物 执行语句语句 这个语句是瞬间完成的即使是1万条也是这样
/// 一句一句转换成SQL语句是相当的慢的
/// INSERT INTO 表2 (Keyword,Trans,Phrase) VALUES (‘undoubtedly‘,‘解释‘,‘短语‘);
/// </summary>
/// <param name="sqlArr">每一行都是完整的 INSERT INTO语句,每插入一条</param>
/// <returns>返回异常的SQL语句</returns>
public string BatchExecuteCmd(string[] sqlArr)
{
StringBuilder sb = new StringBuilder();
using (SQLiteConnection conn = new SQLiteConnection(ConnectionString))
{
SQLiteCommand cmd = new SQLiteCommand(conn);
{
conn.Open();
using (DbTransaction trans = conn.BeginTransaction())
{
for (int i = 0; i < sqlArr.Length; i++)
{
try
{
cmd.CommandText = sqlArr[i];
cmd.ExecuteNonQuery();
}
catch
{
//下面是插入失败的内容
sb.Append(sqlArr[i] + "\n");
//trans.Rollback();//回滚事务
//MessageBox.Show(EX.Message);
}
}
trans.Commit();
//richTextBox2.Text = sb.ToString();
}
}
}
return sb.ToString();
}
}sqlite批量插入速度是相当快的,而转换成sql语句是相当耗时(用for一行一行遍历,然后再把每行分割开来,这个过程相当耗时,因为这里有6万行,什么不做光跑完一遍就得个把小时)。