Вы заметите, что IDbCommand и IDataReader реализуют IDisposable . Всякий раз, когда вы создаете экземпляр объекта IDisposable, вы должны либо обернуть его в , используя оператор , либо вызвать Dispose , как только вы закончите. Если вы этого не сделаете, вы в конечном итоге утечки ресурсов (иногда ресурсы, отличные от просто памяти).
Попробуйте это в своем коде
using (IDbCommand cmd = createQuery(".toInsert", obj))
{
cmd.Prepare(); // This is what is screwing things up
...
//the rest of your example code
...
}
РЕДАКТИРОВАТЬ, чтобы говорить конкретно о подготовке
Я могу видеть из кода, что вы готовите команду, а затем никогда не используете ее повторно.
Идея, лежащая в основе подготовки команды, заключается в том, что подготовка требует дополнительных затрат, но каждый раз, когда вы используете команду, она будет более эффективной, чем не подготовленная инструкция. Это хорошо, если у вас есть команда, которую вы собираетесь многократно использовать, и это компромисс того, стоит ли накладных расходов увеличение производительности команды.
Таким образом, в коде, который вы нам показали, вы готовите команду (оплачиваете все накладные расходы) и не получаете никакой выгоды, потому что вы сразу же отбрасываете команду!
Я бы либо перезапустил подготовленную команду, либо просто отменил вызов на оператор подготовки.
Понятия не имею, почему подготовленные команды просачиваются, но вам не нужно готовить так много команд, особенно команд одноразового использования.