C# 将行中的字从文件加载到sqlite表

C# 将行中的字从文件加载到sqlite表,c#,sqlite,C#,Sqlite,我在c#中创建函数,逐行读取,然后将行加载到sqlite(s3db) 但是有没有更快的办法?我通过sqlite管理员应用程序创建了表。 sqlite可以加载自己的文件并使其成为表吗 我说的是三百多万字(一行一个字) 注:如果有问题,请更正我的主题:)您可以试试。通过阅读本文,请特别注意此处使用的参数化查询,您应该使用这些查询来代替示例中insSQL变量中的字符串连接。您可以尝试。通过阅读本文,请特别注意此处使用的参数化查询,您应该使用这些查询,而不是样本中insSQL变量中的字符串连接。使用事

我在c#中创建函数,逐行读取,然后将行加载到sqlite(s3db)

但是有没有更快的办法?我通过sqlite管理员应用程序创建了表。 sqlite可以加载自己的文件并使其成为表吗


我说的是三百多万字(一行一个字)


注:如果有问题,请更正我的主题:)

您可以试试。通过阅读本文,请特别注意此处使用的参数化查询,您应该使用这些查询来代替示例中
insSQL
变量中的字符串连接。

您可以尝试。通过阅读本文,请特别注意此处使用的参数化查询,您应该使用这些查询,而不是样本中
insSQL
变量中的字符串连接。

使用事务通常会大大加快速度,具体取决于所需的批处理大小。我对DataAdapters和数据源不是100%熟悉,但不是每次都创建一个新连接来插入一行,而是修改代码以使用一个连接,并使用SQLiteConnection.BeginTransaction()和完成时调用Transaction.Commit()

根据所需的批处理大小,使用事务通常会大大加快速度。我对DataAdapters和数据源不是100%熟悉,但不是每次都创建一个新连接来插入一行,而是修改代码以使用一个连接,并使用SQLiteConnection.BeginTransaction()和完成时调用Transaction.Commit()

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

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) 只打开到数据库的连接一次

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

前几天我刚做了这件事,首先使用了事务和参数化查询。我能够在大约一分钟内加载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();

  }
}
内部静态无效FastnSertMany(DbConnection cnn)
{
使用(DbTransaction dbTrans=cnn.BeginTransaction())
{
使用(DbCommand cmd=cnn.CreateCommand())
{
cmd.CommandText=“插入测试用例(MyValue)值(?);
DbParameter Field1=cmd.CreateParameter();
cmd.Parameters.Add(字段1);
对于(int n=0;n<100000;n++)
{
字段1.值=n+100000;
cmd.ExecuteNonQuery();
}
}
dbTrans.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();

  }
}
内部静态无效FastnSertMany(DbConnection cnn)
{
使用(DbTransaction dbTrans=cnn.BeginTransaction())
{
使用(DbCommand cmd=cnn.CreateCommand())
{
cmd.CommandText=“插入测试用例(MyValue)值(?);
DbParameter Field1=cmd.CreateParameter();
cmd.Parameters.Add(字段1);
对于(int n=0;n<100000;n++)
{
字段1.值=n+100000;
cmd.ExecuteNonQuery();
}
}
dbTrans.Commit();
}
}

Hmm我对
DbTransaction oTransaction=conn.BeginTransaction()有问题
由于对象的当前状态,操作无效。
抱歉,忘记添加打开连接。修改了代码(为了完整性还添加了close)。你能解释一下它是如何工作的吗?在sqlite中的表“Words”中,我编写了
创建表[Words]([word]VARCHAR(100)UNIQUE NOT NULL主键)
我无法输入单词
由于违反约束而中止列wyraz NOT UNIQUE
我该怎么办?听起来文件或表中有重复的单词。如果您在未清除表的情况下多次运行应用程序,则您将遇到此问题。要插入或忽略的insert语句(有关详细信息,请参阅)。文件中的第一个单词是
aa
,第二个单词是
aaa
。该文件只包含唯一的单词。嗯,我对
DbTransaction oTransaction=conn.BeginTransaction()有问题
由于对象的当前状态,操作无效。
抱歉,忘记添加打开连接。修改了代码(为了完整性还添加了close)。你能解释一下它是如何工作的吗?在sqlite中的表“Words”中,我编写了
创建表[Words]([word]VARCHAR(100)UNIQUE NOT NULL主键)
我无法输入单词
由于违反约束而中止列wyraz NOT UNIQUE
我该怎么办?听起来文件或表中有重复的单词。如果您在未清除表的情况下多次运行应用程序,则您将遇到此问题。要插入或忽略的insert语句(有关详细信息,请参阅)。文件中的第一个单词是
aa
,第二个单词是
aaa
。该文件仅包含唯一的单词。