2011-09-29 53 views
4

我監聽數據流並將數據作爲插入語句存儲在ConcurrentQueue中,並使用System.Threading.Timer以批量插入插入數據,間隔爲1000。整個場景運行在一個靜態類上。 下面是代碼:錯誤:使用ExecuteNonQuery()不能設置commandtext當使用ExecuteNonQuery()

static void timer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    if (queryQueue.IsEmpty) 
     return; 
    string text = ""; 
//bulkBuilder is StringBuilder. 
//queryQueue is ConcurrentQueue 
    bulkBuilder.AppendLine("PRAGMA synchronous = 0;PRAGMA count_changes = FALSE;PRAGMA journal_mode=OFF;Begin;"); 
    while (queryQueue.TryDequeue(out text)) 
    { 
     bulkBuilder.Append(text); 
     bulkBuilder.AppendLine(";"); 
    } 
    bulkBuilder.AppendLine("Commit;"); 

    try 
    { 
     sqlCommand.CommandText = bulkBuilder.ToString(); 
     sqlCommand.ExecuteNonQuery(); 
    } 
    catch (System.Exception ex) 
    { 
     Console.WriteLine("Error while inserting Data : " + ex.Message); 
    } 
    finally 
    { 
     bulkBuilder.Clear(); 
    } 

} 

有趣的是,sqlCommand在此計時器只用於插入,只是ExecuteNonQuery()。並且時常發生錯誤,提示「在數據訪問器處於活動狀態時無法設置commandtext」。這是無稽之談,因爲此代碼與sqlCommand中的內部SQLiteDataReader無關。

我該如何擺脫這個錯誤?

回答

11

我會爲每個SQL語句創建一個新的SqlCommand(或任何類型的sqlCommand)。讓連接池處理所有有效使它 - 你需要做一些與數據庫中每個時間:

  • 創建和打開連接
  • 創建命令
  • 執行命令
  • 處置的命令和連接(用using語句)

這樣,你不能用一個命令的影響另一個命令本地狀態結束了,不是由於耗盡o其他f連接池空間等。

開發人員經常試圖通過反覆使用一個連接(以及可能的命令)來進行優化,但這是一種虛假的經濟並導致像您所示的問題。