在从文件到sqlite表的行中加载单词

时间:2011-11-18 21:22:17

标签: c# sqlite

我在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。如果出现问题,请更正我的主题:)

4 个答案:

答案 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();

  }
}