将行字从文件加载到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。

将行字从文件加载到sqlite表

是的,有一种更快的方法,使用以下技术:

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