将行字从文件加载到sqlite表
本文关键字:sqlite 加载 文件 | 更新日期: 2023-09-27 18:15:04
我在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可以加载自己的文件,使其作为一个表吗?
我说的是300多万字(一行一个字)。
p。
是的,有一种更快的方法,使用以下技术:
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");
}
您可以尝试批量插入。在阅读本文时,请特别注意这里使用的参数化查询,您应该在insSQL
变量中使用它们来代替示例中的字符串连接。
使用Transactions通常会加快一些速度,这取决于您想要的批处理大小。我不是100%熟悉数据适配器和数据源,而是每次插入一行时创建一个新的连接,修改代码以使用一个连接并使用SQLiteConnection.BeginTransaction(),当你完成时调用Transaction.Commit()。
我前几天就这样做了,首先使用事务和参数化查询。我能够在大约一分钟内加载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();
}
}