Почему возникает исключение при попытке открыть соединение? - PullRequest
0 голосов
/ 08 декабря 2011

Я получаю исключение в моем коде C # при открытии соединения. Visual Studio выдает исключение, говорящее «Соединение не было закрыто. Текущее состояние соединения открыто. '. Странно то, что соединение вообще не открыто.

Странно то, что проблема возникает только на одном ПК (ПК-1). На 2 других ПК (ПК-2 и ПК-3) код компилируется и прекрасно работает на этих двух других ПК без каких-либо исключений. Если я разверну в Azure с этих ПК-2 или ПК-3, все будет работать.

Все 3 ПК имеют одинаковую версию Visual Studio 2010 SP1 (10.0.40219.1 SP1Rel), .NET (4.0.30319 SP1Rel), Azure 1.6 SDK, Azure Ap Fabric 1.5.37 и инструменты Azure для VS2010 (1.6.41103.1601)

Вот соответствующая часть кода:

   private long[] Foo(long rId, long mItemId)
    {
        List<long> list = null;

        using (myDBEntities ctx = new myDBEntities())
        {
            EntityConnection entityConnection = (EntityConnection)ctx.Connection;

            using (DbConnection connection = entityConnection.StoreConnection)
            {
                connection.Open();
                ...

Вот полная информация об исключении:

System.InvalidOperationException was unhandled by user code
Message=The connection was not closed. The connection's current state is open.
Source=System.Data
StackTrace:
    at System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
    at System.Data.SqlClient.SqlConnection.Open()
    at myPost.Models.Repository.Foo(Int64 rId, Int64 mItemId) in C:\code\Models\Repository.cs:line 326
    at myPost.Models.Repository.Foo(Int64 menuItemId, Int64 rId, mItemRatings[]& ratings, Photos[]& thumbnails) in C:\code\Models\Repository.cs:line 92
    at myPost.Controllers.HomeController.Index(String part1, String part2, String embed) in C:\code\Controllers\HomeController.cs:line 97
    at lambda_method(Closure , ControllerBase , Object[] )
    at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
    at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12()
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
InnerException: 

На проблемном ПК (ПК-1), чтобы запустить код, я должен добавить connection.Close(); прямо перед connection.Open();. Однако это нарушает работу ПК-2 и ПК-3 и, что еще хуже, при развертывании в Azure выдается исключение, поскольку добавленный мной connection.Close() не был необходим.

Понятия не имею, что не так с настройкой на ПК-1, так как кажется, что это проблема конфигурации, а не проблема кода.

1 Ответ

0 голосов
/ 08 декабря 2011

Согласен, это, вероятно, не проблема кода.Просто сделайте быструю проверку того, открыто ли соединение или нет, прежде чем продолжить - вероятно, лучше сделать это в любом случае.Что-то вроде:

if (connection.State == System.Data.ConnectionState.Open)
{
     // ahoy, mate!
}
else
{
    connection.Open();
    // here be dragons
}

Я все нахожусь в поиске Призрака в Машине, но иногда просто сделать проверку состояния и двигаться дальше по жизни.

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