【问题标题】:C# SQLite reader in for loop slowC# SQLite 阅读器在 for 循环中很慢
【发布时间】:2014-08-23 14:49:24
【问题描述】:

我正在使用数据阅读器从 sqlite 数据库中检索数据。 这是在双 for 循环中执行的。但是很慢,因为现在要执行多次sql查询。

有没有更快的方法来做到这一点? 这是我现在正在做的简短版本:

for(int i=0;i < horizontal; i++)
{
  for(int j=0;j < vertical; j++)
  {
    SQLiteConnection con = new SQLiteConnection(dbConnection);
    con.Open();
    SQLiteCommand cmd = new SQLiteCommand(con);
    cmd.CommandText = query;        
    SQLiteDataReader reader = cmd.ExecuteReader();
    dt.Load(reader);
    con.Close();

    // Perform some actions onto DataTable data
  }
}

编辑: 在循环之前打开和关闭并没有多大帮助。 我正在尝试查询位置列在 4 点之间的表的所有行,对其执行一些计算并移动到下一个单元格(想想网格)。

【问题讨论】:

  • 不需要在循环中频繁创建 SQLiteConnection 对象。在循环之前创建它并在循环之后关闭它。
  • 试过了,但不是真正的解决方案。问题是执行水平 * 垂直时间的查询。但我不知道如何才能减少这个。
  • 能否展示一下 SQL 查询并解释嵌套循环的目的是什么以及它如何影响查询?
  • 嵌套循环会影响从数据库中选择的数据(其中 x BETWEEN xmin AND xmax AND y BETWEEN ymin AND ymax)。

标签: c# sql database sqlite


【解决方案1】:

如果您使用相同的连接,您可以创建 SQLiteConnection 对象并在迭代以上打开连接,您还应该在迭代下关闭连接。它应该更快。

【讨论】:

    【解决方案2】:
    SQLiteConnection con = new SQLiteConnection(dbConnection);
    con.Open();
    SQLiteCommand cmd = new SQLiteCommand(con);
    for(int i=0;i < horizontal; i++)
    {
      for(int j=0;j < vertical; j++)
      {
        cmd.CommandText = query;    
        SQLiteDataReader reader = cmd.ExecuteReader();
        dt.Load(reader);
        // Perform some actions onto DataTable data
      }
    }
    con.Close();
    

    只改变命令文本,不需要每次都实例化一个新的。另外,只有在完成查询后才关闭它。

    【讨论】:

      【解决方案3】:

      using Finisar.SQLite;吗?

      如果是这样,请尝试更改为using System.Data.SQLite;。 对我很有帮助,form 6s 减少到 150 ms。

      【讨论】:

        猜你喜欢
        • 2014-05-17
        • 2017-08-19
        • 2020-09-09
        • 2021-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-14
        • 1970-01-01
        相关资源
        最近更新 更多