我在c#中使函数逐行读取,然后将行加载到sqlite(s3db)。
private void LoadFromDictionary()
{
Encoding enc = Encoding.GetEncoding(1250);
using (StreamReader r = new StreamReader("c:\\Temp2\\dictionary.txt", enc))
{
string line = "";
while ((line = r.ReadLine()) != null)
{
line = line.Trim();
AddWord(line);
}
}
MessageBox.Show("Finally :P", "Info");
}
private void AddWord(string w)
{
String insSQL = "insert into Words values(\"" + w + "\")";
String strConn = @"Data Source=C:\Temp2\dictionary.s3db";
SQLiteConnection conn = new SQLiteConnection(strConn);
SQLiteDataAdapter da = new SQLiteDataAdapter(insSQL, strConn);
da.Fill(dt);
dataGridView1.DataSource = dt.DefaultView;
}
但这是否更快?我通过sqlite管理员应用程序创建了表。 sqlite可以加载自己的文件并将其作为表格吗?
我说的是3千多万字(一行中有一个字)。
PS。如果出现问题,请更正我的主题:)
答案 0 :(得分:3)
是的,使用以下技术的方法要快得多:
1)只打开一次与数据库的连接
2)使用参数化命令可以获得更好的性能和更低的开销(不必在每次传递时使用新的字符串)。
3)在事务中包装整个操作。作为一般规则,这将改善您的表现。
请注意,我没有显示事务回滚或关闭连接,这也是应该实现的最佳实践。
private void LoadFromDictionary()
{
Encoding enc = Encoding.GetEncoding(1250);
string strConn = @"Data Source=C:\Temp2\dictionary.s3db";
SqliteConnection conn = new SqliteConnection(strConn);
conn.Open();
string insSQL = "insert or ignore into wyrazy values(@Word)";
DbCommand oCommand = conn.CreateCommand();
oCommand.Connection = conn;
oCommand.CommandText = insSQL;
DbParameter oParameter = oCommand.CreateParameter();
oParameter.Name = "@Word";
oParameter.DbType = DbType.String;
oParameter.Size = 100;
oCommand.Parameters.Add(oParameter);
DbTransaction oTransaction = conn.BeginTransaction();
using (StreamReader r = new StreamReader("c:\\Temp2\\dictionary.txt", enc))
{
string line = "";
while ((line = r.ReadLine()) != null)
{
line = line.Trim();
if (!string.IsNullOrEmpty(line)) {
oParameter.Value = line;
oCommand.ExecuteNonQuery();
}
}
}
oTransaction.Commit();
conn.Close();
MessageBox.Show("Finally :P", "Info");
}
答案 1 :(得分:0)
您可以尝试bulk insert。通过阅读本文,请特别注意那里使用的参数化查询,您应该使用它来代替insSQL
变量中样本中的字符串连接。
答案 2 :(得分:0)
使用事务通常可以加快速度,具体取决于您所需的批量大小。我不是100%熟悉DataAdapters和DataSources,而是每次插入一行时都不创建新连接,修改代码以使用一个连接并使用SQLiteConnection.BeginTransaction()以及完成后调用Transaction.Commit ()。
答案 3 :(得分:0)
我前几天刚刚做了这个,首先使用了一个事务,并参数化了查询。我能够在大约一分钟内加载1600万行。
internal static void FastInsertMany(DbConnection cnn)
{
using (DbTransaction dbTrans = cnn.BeginTransaction())
{
using (DbCommand cmd = cnn.CreateCommand())
{
cmd.CommandText = "INSERT INTO TestCase(MyValue) VALUES(?)";
DbParameter Field1 = cmd.CreateParameter();
cmd.Parameters.Add(Field1);
for (int n = 0; n < 100000; n++)
{
Field1.Value = n + 100000;
cmd.ExecuteNonQuery();
}
}
dbTrans.Commit();
}
}