2015-08-16 53 views
0

我是一个业余爱好者程序员,编写一个报告工具将数据从SQLite数据库导出到Excel。SQLite代码优化

Excel部分是编写和工作的,我从SQLite中检索的数据是在程序中创建一个块并花费几分钟来处理。

我已经使用通用值重写了代码以帮助说明这些过程。初始的populateList模块所花费的时间可以忽略不计,但我已经将其包含在内,因为这是为doStuff模块提供数据。 populateList当前检索大约500个不同的记录。

我需要该程序遍历populateList检索的所有值并进行多次计数。然后用计数值填充另一个列表valuesCount

我试图通过在不关闭SQLite连接的情况下遍历列表来提高速度,但改进还不够。是否有更有效的方式从数据库中检索这些信息?

public list<string>populateList() 
{ 
List<string>values = new list<string>(); 
using (SQLiteConnection con = new SQLiteConnection(Passer.connstr)) 
{ 
    con.Open(); 
    string distinctValues = "SELECT DISTINCT \"value list\" FROM valueTable order by \"value list\" "; 
    using (SQLiteCommand cmd = new SQLiteCommand(distinctValues, con)) 
    { 
     SQLiteDataReader sqReader; 
     sqReader = cmd.ExecuteReader(); 
     while (sqReader.Read()) 
     { 
      values.Add(sqReader["value list"].ToString()); 
     } 
    } 
} 
return values; 
} 

public void doStuff() 
{ 
bool blanks = false; 
string singleValue = string.Empty 
string query = string.Empty; 

List<string> getInitialValues = populateList(); 
list<string> valuesCount = new list<string>(); 
    using (SQLiteConnection con = new SQLiteConnection(Passer.connstr)) 
    { 
     con.Open(); 
     for(int i = 0; i < getInitialValues.Count; i++) 
     { 
      blanks = false; 
      singleValue = getInitialValues[i]; 
      if(singlevalue == "") 
      { 
       singleValue = \"\"; 
       blanks = true; 
      } 
      for (int x = 0; x < 6; x++) 
      { 
       string statement = string.Empty; 
       switch(x) 
       { 
        case 0: 
         statement = "SELECT COUNT(*) from valueTable where \"column1\" = "; 
         break; 
        case 1: 
         statement = "SELECT COUNT(*) from valueTable where \"column2\" = \"condition 1\" and \"column1\" = "; 
         break; 
        case 2: 
         statement = "SELECT COUNT(*) from valueTable where \"column3\" = \"condition 3\" and \"column1\" = "; 
         break; 
        case 3: 
         statement = "SELECT COUNT(*) from valueTable where \"column4\" = \"condition 4\" and \"column1\" = "; 
         break; 
        case 4: 
         statement = "SELECT COUNT(*) from valueTable where \"column5\" = \"condition 5\" and \"column1\" = "; 
         break; 
        case 5: 
         statement = "SELECT COUNT(*) from valueTable where \"column6\" = \"condition 6\" and \"column1\" = "; 
         break;      
       } 
       if (blanks == true) 
       { 
        query = System.String.Format("{0}{1}", statement, singleValue); 
       } 
       else 
       { 
        query = System.string.format("{0}\"{1}\"", statement, singleValue); 
       } 
       using (SQLiteCommand cmd = new SQLiteCommand(query, con)) 
       { 
        string countValues = cmd.ExecuteScalar().ToString(); 
        valuesCount.Add(countValues); 
       } 
      } 
     } 
    } 
} 

回答

0

您正在多次查询数据库以获取相同的信息。 我会建议不要对dostuff方法进行任何db调用,而是使用单个查询来获取可记录的记录表单。

然后您可以对列表本身进行计数操作。

例如获得

"SELECT 'valueCol' , 'col1', 'col2' from valueTable" 

将是你唯一的查询,你会其存储在一个列表(说值列表)。

然后在C#侧您可以使用

//not actual code just a sample idea 
    var distinctValues = valueList.select(v => w.valueCol).Distinct() 
    var count = 0; 
    switch(case): 
     case 0: 
      count += valueList.where(v => v.col1 == condition).Count(); 
       break; //and so on... 
+0

谢谢SadiRubaiyet,我身边有改变的代码如你所说,有一个显著的性能提升。 – vectors36

1

考虑将它作为单个SQL查询写入。

当您看起来很像您只需要在列上执行“条件计数”时,您正在执行许多查询。 SQL将沿着

select 
    val, 
    col1 = sum(case when col1 = 'cond1' then 1 end) 
from valtbl 
group by val 

你甚至不需要第一种方法来获得不同值的列表。

或者,因为表格看起来相当小,请选择“行”列表中的所需内容,然后使用Linq对象执行计数。