Я прослушиваю поток данных и сохраняю данные в виде операторов вставки в ConcurrentQueue
и вставляю данные с помощью массовой вставки, используя System.Threading.Timer
с интервал 1000. Весь сценарий выполняется в статическом классе.
Вот код:
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 ()
в этом таймере. И время от времени появляется сообщение об ошибке: «Невозможно установить командный текст, пока активен считыватель данных». Это чушь, поскольку этот код не имеет ничего общего с внутренним SQLiteDataReader
в sqlCommand
.
Как мне избавиться от этой ошибки?