c# - C# 应用程序的 SQlite 部分耗时太长

标签 c# performance sqlite

<分区>

我正在使用 c# winforms 和 sqlite 作为我的数据库制作一个应用程序。

它只是读取文本文件,将它们传输到数据库,解析它们,然后显示用户输出。

问题:SQlite 部分非常慢。运行与填充数据库相关的代码大约需要 3 分钟!

我是编程新手,所以我真的不知道关键问题是什么。除了尝试优化我的代码以仅包含所需内容之外,是否有任何工具可以帮助提高应用程序速度、清理后台垃圾等?

这是应用程序的缓慢部分:

 private void button4_Click(object sender, EventArgs e)
    {

          SQLiteConnection sqlite_conn;
          SQLiteCommand sqlite_cmd;
          SQLiteDataReader sqlite_datareader;


          sqlite_conn = new SQLiteConnection(@"Data Source=database.db;Version=3;");


          sqlite_conn.Open();

          // create a new SQL command:
          sqlite_cmd = sqlite_conn.CreateCommand();


          sqlite_cmd.CommandText = "CREATE TABLE IF NOT EXISTS 'abc' (Seq text, Field text, Desc text, Len text, Dec text, Typ text, Percnt text, Pop text, Alzero text, MaxLen text );";


          sqlite_cmd.ExecuteNonQuery();

          // **** SQLITE TRANSFER SECTION 1 - transfer values from list1 to table1 *****

          sqlite_cmd.CommandText = " DELETE FROM abc";
          sqlite_cmd.ExecuteNonQuery();

          sqlite_cmd.CommandText = "INSERT INTO abc (Seq, Field, Desc, Len, Dec, Typ, Percnt, Pop, Alzero, MaxLen) VALUES (@p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10)";
          sqlite_cmd.Parameters.AddWithValue("@p1", 6);  // dummy initial values 
          sqlite_cmd.Parameters.AddWithValue("@p2", 878); 
          sqlite_cmd.Parameters.AddWithValue("@p3", 56);
          sqlite_cmd.Parameters.AddWithValue("@p4", 6);
          sqlite_cmd.Parameters.AddWithValue("@p5", 546);
          sqlite_cmd.Parameters.AddWithValue("@p6", 565);
          sqlite_cmd.Parameters.AddWithValue("@p7", 568);
          sqlite_cmd.Parameters.AddWithValue("@p8", 526);
          sqlite_cmd.Parameters.AddWithValue("@p9", 586);
          sqlite_cmd.Parameters.AddWithValue("@p10", 526);


          for (int i = 0; i < NumListValues; i += 10) // Filling SQlite table rows and columns with values from our list 
          {
              sqlite_cmd.Parameters.AddWithValue("@p1", list[i]);
              sqlite_cmd.Parameters.AddWithValue("@p2", list[i+1]);
              sqlite_cmd.Parameters.AddWithValue("@p3", list[i+2]);
              sqlite_cmd.Parameters.AddWithValue("@p4", list[i+3]);
              sqlite_cmd.Parameters.AddWithValue("@p5", list[i+4]);
              if (i > 490)
                  break; 
              sqlite_cmd.Parameters.AddWithValue("@p6", list[i+5]);
              sqlite_cmd.Parameters.AddWithValue("@p7", list[i+6]);
              sqlite_cmd.Parameters.AddWithValue("@p8", list[i+7]);
              sqlite_cmd.Parameters.AddWithValue("@p9", list[i+8]);
              sqlite_cmd.Parameters.AddWithValue("@p10", list[i+9]);
              sqlite_cmd.ExecuteNonQuery();

          }

          //   **** SQLITE TRANSFER SECTION 2 - transfer values from list2 to 2nd table *****

          sqlite_cmd.CommandText = "CREATE TABLE IF NOT EXISTS 't2' (YYMM text, MinDate text, MaxDate text, TotalTrans text, DebitTrans text, AMOUNTINDOCUMENTCURREN text );";

          sqlite_cmd.ExecuteNonQuery();

          sqlite_cmd.CommandText = " DELETE FROM t2";
          sqlite_cmd.ExecuteNonQuery();

          sqlite_cmd.CommandText = "INSERT INTO t2 (YYMM, MinDate, MaxDate, TotalTrans, DebitTrans, AMOUNTINDOCUMENTCURREN ) VALUES (@b1, @b2, @b3, @b4, @b5, @b6)";
          sqlite_cmd.Parameters.AddWithValue("@b1", 6);  // dummy initial values 
          sqlite_cmd.Parameters.AddWithValue("@b2", 878); 
          sqlite_cmd.Parameters.AddWithValue("@b3", 56);
          sqlite_cmd.Parameters.AddWithValue("@b4", 6);
          sqlite_cmd.Parameters.AddWithValue("@b5", 546);
          sqlite_cmd.Parameters.AddWithValue("@b6", 565);

         for (int i = 0; i < NumList2Values; i+= 6) // Filling SQlite table rows and columns with values from list2
         {
             sqlite_cmd.Parameters.AddWithValue("@b1", list2[i]);
             sqlite_cmd.Parameters.AddWithValue("@b2", list2[i+1]);
             sqlite_cmd.Parameters.AddWithValue("@b3", list2[i+2]);
             sqlite_cmd.Parameters.AddWithValue("@b4", list2[i+3]);
             sqlite_cmd.Parameters.AddWithValue("@b5", list2[i+4]);
             sqlite_cmd.Parameters.AddWithValue("@b6", list2[i+5]);
             sqlite_cmd.ExecuteNonQuery();
         }



        // Create table to transfer values from list 3

       sqlite_cmd.CommandText = "CREATE TABLE IF NOT EXISTS 't3' (YYWW text, MinDate text, MaxDate text, TotalTrans text, DebitTrans text, AMOUNTINDOCUMENTCURREN text );";

       sqlite_cmd.ExecuteNonQuery();

       sqlite_cmd.CommandText = " DELETE FROM t3";
       sqlite_cmd.ExecuteNonQuery();

       sqlite_cmd.CommandText = "INSERT INTO t3 (YYWW, MinDate, MaxDate, TotalTrans, DebitTrans, AMOUNTINDOCUMENTCURREN ) VALUES (@c1, @c2, @c3, @c4, @c5, @c6)";
       sqlite_cmd.Parameters.AddWithValue("@c1", 6);  // dummy initial values 
       sqlite_cmd.Parameters.AddWithValue("@c2", 878); 
       sqlite_cmd.Parameters.AddWithValue("@c3", 56);
       sqlite_cmd.Parameters.AddWithValue("@c4", 6);
       sqlite_cmd.Parameters.AddWithValue("@c5", 546);
       sqlite_cmd.Parameters.AddWithValue("@c6", 565);

       for (int i = 0; i < NumList3Values ; i+= 6) // Filling SQlite table rows and columns with values from list2
       {
           sqlite_cmd.Parameters.AddWithValue("@c1", list3[i]);
           sqlite_cmd.Parameters.AddWithValue("@c2", list3[i+1]);
           sqlite_cmd.Parameters.AddWithValue("@c3", list3[i+2]);
           sqlite_cmd.Parameters.AddWithValue("@c4", list3[i+3]);
           sqlite_cmd.Parameters.AddWithValue("@c5", list3[i+4]);
           sqlite_cmd.Parameters.AddWithValue("@c6", list3[i+5]);
           sqlite_cmd.ExecuteNonQuery();

       }
   }

最佳答案

我注意到的一些事情。

- 在进入下一个插入语句之前,您永远不会清除参数列表。我会在您使用参数的每个查询之间运行“sqlite_cmd.Parameters.Clear()”。

-您正在运行大量插入语句、一些“创建表”语句和“从表中删除所有内容”语句。这些都可以在单个事务中完成,从而大大加快速度。

要使用事务,首先运行此 SQL 查询。

BEGIN TRANSACTION

完成插入后运行此查询。

COMMIT TRANSACTION

此外,如果您不熟悉使用 SQLite,此链接可能会派上用场,其中列出了所有可能的 SQLite 命令以及有关它们的作用的信息。

http://www.sqlite.org/lang.html

关于c# - C# 应用程序的 SQlite 部分耗时太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20099975/

相关文章:

sqlite - 如何在计数中显示0?

c# - MVVM 解决方案结构

c# - itextsharp 和图像大小

performance - 如何在Matlab中向量化 'for'循环

vb.net - 在VB.Net中将Excel数据导入SQLite数据库的有效方法

c++ - Sqlite 不再打开 Google Drive 数据库

c# - 每个参数 "pattern"的分配和评估是否有名称?

c# - 虚拟网络摄像头输入为字节流

mysql - 实现基于父ID关系的查询

javascript - 弹出窗口中的浮线图具有重叠的轴标签