CLR: System.InvalidOperationException: контекстное соединение уже используется - PullRequest
1 голос
/ 29 июля 2010

Я продолжаю получать эту ошибку при попытке выполнить удаление в середине моего DataReader:

System.InvalidOperationException: контекстное соединение уже используется.

Я получаю все строки, которые необходимо удалить, и затем перебираю читатель данных, так как возвращено много строк.

SqlConnection conn = new SqlConnection ("context connection = true");

        SqlCommand cmd = new SqlCommand();
        cmd.Connection = conn;
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "spClean_Select_Product_For_Delete";
        cmd.CommandTimeout = 41600;

        conn.Open();
        SqlDataReader reader = cmd.ExecuteReader();

        try
        {
            SqlContext.Pipe.Send(DateTime.Now.ToString() + " - Started working with Product");

            while (reader.Read())
            {
                SqlContext.Pipe.ExecuteAndSend(new SqlCommand("DELETE FROM ProductInfo WHERE ProductId = " 
                    + reader["ProductId"].ToString()));
            }

            SqlContext.Pipe.Send(DateTime.Now.ToString() + " - Completed working with Product");
        }
        finally
        {
            conn.Close();
            // Always call Close when done reading.
            reader.Close();
        }

Ответы [ 2 ]

2 голосов
/ 02 августа 2010

Наиболее вероятной причиной этого исключения является то, что вы отправляете команды удаления на сервер одновременно с выбором записей для удаления.Я бы посоветовал вам сначала собрать все идентификаторы продуктов, которые вы хотите удалить, и только потом удалять их:

ICollection<int> productIds = new HashSet<int>();
using (var cmd = new SqlCommand("spClean_Select_Product_For_Delete"))
{
    using (var reader = cmd.ExecuteReader())
    {
        var productId = (int) reader["ProductId"];
        productIds.Add(productId);
    }
}
string deleteCmdString =
    "DELETE FROM Product WHERE ProductId IN (" + productIdsString + ")";
SqlContext.Pipe.ExecuteAndSend(new SqlCommand(deleteCmdString))

Приведенный выше код, вероятно, не является полным или правильным, но вам следует понять.

0 голосов
/ 22 апреля 2011

Попробуйте добавить MultipleActiveResultSets = true в строку подключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...