SQLite代码优化

我是一个业余爱好者程序员,编写一个报告工具将SQLite数据库中的值导出到Excel中。

Excel部分是写和工作的,我从SQLite中检索的数据是在程序中创build一个块,需要几分钟的时间来处理。

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

我需要程序遍历populateList检索的所有值,并做好几个计数。 然后用计数的值填充另一个列表值valuesCount

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

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

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

那么你可以在列表本身上进行计数操作。

比如get

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

将是你唯一的查询,你会将它存储在一个列表(比如valueList)。

然后在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... 

考虑将其编写为单个SQL查询。

如果您只是需要在列上执行“条件计数”,您正在执行许多查询。 SQL将沿着

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

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

或者,如果表格看上去相当小,则select“行”列表中的所需内容,然后使用Linq对象执行计数。