【发布时间】:2020-12-23 13:21:08
【问题描述】:
我正在使用 SQLite 数据库,并向其中插入记录。这需要很长时间!我见过有人说他们可以在一分钟内处理几千个。我有大约 2400 条记录。每条记录需要 30s-2m 才能完成。重新创建数据库不是一种选择。我试图以不同的方式创建一个交易。我需要使用计时器,因为我正在使用ProgressBar 向我展示正在发生的事情。这是我正在使用的代码:
string con;
con = string.Format(@"Data Source={0}", documentsFolder);
SQLiteConnection sqlconnection = new SQLiteConnection(con);
SQLiteCommand sqlComm = sqlconnection.CreateCommand();
sqlconnection.Open();
SQLiteTransaction transaction = sqlconnection.BeginTransaction();
Timer timer2 = new Timer();
timer2.Interval = 1000;
timer2.Tick += (source, e) =>
{
URL u = firefox.URLs[count2];
string newtitle = u.title;
form.label1.Text = count2 + "/" + pBar.Maximum;
string c_urls = "insert or ignore into " + table + " (id,
url, title, visit_count, typed_count, last_visit_time, hidden) values (" + dbID + ",'" + u.url + "','"
+ newtitle + "',1,1, " + ToChromeTime(u.visited) + ", 0)";
string c_visited = "insert or ignore into " + table2 + " (id,
url,
visit_time, transition) values (" + dbID2 + "," + dbID + "," +
ToChromeTime(u.visited) + ",805306368)";
sqlComm = new SQLiteCommand(c_urls, sqlconnection);
sqlComm.ExecuteNonQuery();
sqlComm = new SQLiteCommand(c_visited, sqlconnection);
sqlComm.ExecuteNonQuery();
dbID++;
dbID2++;
pBar.Value = count2;
if (pBar.Maximum == count2)
{
pBar.Value = 0;
timer.Stop();
transaction.Commit();
sqlComm.Dispose();
sqlconnection.Dispose();
sqlconnection.Close();
}
count2++;
};
timer2.Start();
我做错了什么?
【问题讨论】:
-
您是否尝试过直接对数据库运行插入命令(而不是通过 C#)?您要插入的表格中有多少项目?它的架构是什么样的(字段 + 键 + 索引)?这张桌子上有触发器吗?
-
好的,我已插入标准 Chrome 历史数据库。我正在插入大约 2400 条记录。
-
@StriplingWarrior 向您提出了具体问题(其中 4 个),您在回复中均未提及。 “一个标准的 Chrome 历史数据库”没有回答“你试过直接针对数据库运行吗?”,“表中有多少项目?” (这与“您要插入多少项目”不同),或者向不熟悉“标准 Chrome 历史数据库”架构但熟悉运行 SQLite 插入语句的用户提供任何信息。
-
对不起。我不能直接尝试,因为这些值是批量的,来自另一个数据库。在我插入数据库之前,我清除了表 url 和访问,所以这将是 0 值。这是我找到的用于创建 urls 表的代码:
CREATE TABLE urls(id INTEGER PRIMARY KEY,url LONGVARCHAR,title LONGVARCHAR,visit_count INTEGER DEFAULT 0 NOT NULL, typed_count INTEGER DEFAULT 0 NOT NULL,last_visit_time INTEGER NOT NULL,hidden INTEGER DEFAULT 0 NOT NULL, favicon_id INTEGER DEFAULT 0 NOT NULL); CREATE INDEX urls_favicon_id_INDEX ON urls (favicon_id); CREATE INDEX urls_url_index ON urls (url); -
这是访问表的代码:
CREATE TABLE visits(id INTEGER PRIMARY KEY,url INTEGER NOT NULL,visit_time INTEGER NOT NULL,from_visit INTEGER,transition INTEGER DEFAULT 0 NOT NULL,segment_id INTEGER,is_indexed BOOLEAN);CREATE INDEX visits_from_index ON visits (from_visit); CREATE INDEX visits_time_index ON visits (visit_time); CREATE INDEX visits_url_index ON visits (url);