2013-11-20 126 views
1

我正在使用c#winforms和sqlite作爲我的數據庫。SQlite C#應用程序的一部分需要太長時間

它只是讀取文本文件,將它們傳輸到數據庫,解析它們,然後顯示用戶輸出。

問題: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(); 

     } 
    } 
+1

如果執行所有插入一個的ExecuteNonQuery –

+2

[這個答案](http://stackoverflow.com/a/4356379/2366976)可能會有所幫助這將是更快 –

+1

你可能不需要虛擬初始值參數。 –

回答

4

幾件事我注意到。

- 在移動到下一個插入語句之前,您從不清除參數列表。我會在每個使用參數的查詢之間運行'sqlite_cmd.Parameters.Clear()'。

- 您正在運行大量的插入語句,一些「創建表」語句和「從表中刪除所有內容」語句。這些都可以在一次交易中完成,以大大加快速度。

要使用事務,請在開始時運行此SQL查詢。

BEGIN TRANSACTION 

並且在完成插入後運行此查詢。

COMMIT TRANSACTION 

另外,如果你是新來使用SQLite,這個環節可能會派上用場,列出對他們做什麼,所有可能的SQLite的命令和信息。

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

+0

謝謝!但是,我將如何使用我的代碼實際使用這些交易? 我應該只在開始和提交事務中放入everysqlite命令 – Newuser

+1

在創建第一個表之前,只需運行Begin Transaction,然後在示例代碼中的最後一個插入命令之後運行Commit Transaction。從技術上講,如果你沒有先說「Begin Transaction」,那麼你運行的每一條SQL命令都會創建它自己的事務。這就是爲什麼開始事務節省時間,您的200多個SQL插入命令只需要創建一個事務,而不是每個查詢200多個單獨的事務。 – ShadowLiberal

+0

剛剛嘗試過,從3分鐘到3秒:D – Newuser

相關問題