Как избежать «Уже есть открытый DataReader, связанный с этим подключением, который должен быть закрыт первым». в коннекторе MySql / net? - PullRequest
5 голосов
/ 08 июня 2011

У меня есть следующий фрагмент кода:

public TimestampedRowStorage GetTimestampedRowStorage(string startTime, string endTime, long trendSettingID, int? period)
    {
        var timestampedList = (from t in dataContext.TrendRecords
                                     where t.TrendSetting_ID == trendSettingID
                                     select t).ToList();

        return new TimestampedRowStorage
        {
            TimestampedDictionary = timestampedList.ToDictionary(m => m.Timestamp,
                m => (from j in dataContext.TrendSignalRecords
                      where j.TrendRecord_ID == m.ID
                      select j).ToDictionary(p => p.TrendSignalSetting.Name,
                p => (double?)p.Value))
        };
    }

Но я всегда получаю следующее исключение:

Уже существует открытый DataReader, связанный с этим подключением, который должен бытьсначала закрыто.

Вот трассировка стека:

[MySqlException (0x80004005): уже существует открытый DataReader, связанный с этим подключением, который должен быть закрыт первым.]
MySql.Data.MySqlClient.MySqlCommand.CheckState () +237 MySql.Data.MySqlClient.MySqlCommand.ExecuteReader (поведение CommandBehavior) + 146
MySql.Data.1015 * System.Data.Common.DbCommand.ExecuteReader (поведение CommandBehavior) + 10
System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands (поведение EntityCommand entityCommand, поведение CommandBehavior) + 443

исключительная ситуация: 1010при выполнении определения команды.Подробности см. Во внутреннем исключении.]

System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands (EntityCommand entityCommand, поведение CommandBehavior) + 479
System.Data.Objects.Internal.ObjectQueryExecutionPlan.ExecutePlayingPlan.ExecuteOppjectPlan.Execute+ 736
System.Data.Objects.ObjectQuery 1.GetResults(Nullable 1 forMergeOption) + 149
System.Data.Objects.ObjectQuery 1.Execute(MergeOption mergeOption) +31<br> System.Data.Objects.DataClasses.EntityReference 1.Load (MergeOption mergeOption) + 148
System.Data.Objects.DataClasses.RelatedEnd.Load () +37 System.Data.Objects.DataClasses.RelatedEnd.DeferredLoad () +8032198 System.Data.Objects.DataClasses.EntityReference 1.get_Value() +12 Nebula.Models.TrendSignalRecord.get_TrendSignalSetting() in C:\Users\Bruno Leonardo\documents\visual studio 2010\Projects\Nebula\Nebula\Models\SmgerDataModel.Designer.cs:2528 Nebula.Models.Trends.TrendRepository.<GetTimestampedRowStorage>b__b(TrendSignalRecord p) in C:\Users\Bruno Leonardo\documents\visual studio 2010\Projects\Nebula\Nebula\Models\Trends\TrendRepository.cs:229 System.Linq.Enumerable.ToDictionary(IEnumerable 1 источник, Func 2 keySelector, Func 2 elementSelector, IEqualityComparer 1 comparer) +226<br> System.Linq.Enumerable.ToDictionary(IEnumerable 1 источник, Func 2 keySelector, Func 2 elementSelector) + 54
Nebula.Models.Trends.TrendRepository.b__a (TrendRecord m) в C: \ Users \ Бруно Леонардо \ Documents \ visual studio 2010 \ Проекты \ Туманность \ Туманность \Models \ Trends \ TrendRepository.cs: 227 System.Linq.Enumerable.ToDictionary (IEnumerable 1 source, Func 2 keySelector, Func 2 elementSelector, IEqualityComparer 1 сравнение) + 240
System.Linq.Enumerable.ToDictionary (IEnumerable 1 source, Func 2 keySelector, Func 2 elementSelector) +53<br> Nebula.Models.Trends.TrendRepository.GetTimestampedRowStorage(String startTime, String endTime, Int64 trendSettingID, Nullable 1 период) в C: \ Users \ Бруно Леонардо \ Documents \ visual studio 2010 \ Проекты \ Туманность \Туманность \ Models \ Trends \ TrendRepository.cs: 2241 allTrends) в C: \ Users \ Bruno Leonardo \ Documents \ visual studio 2010 \ Проекты \ Туманность \ Nebula \ Models \ Trends \ TrendRepository.cs: 206 Nebula.Controllers.GeneratingUnitController.TrendSettings (идентификатор Int64, идентификатор объекта Int64, идентификатор объекта Int64 ,6464 trendSettingID,String startTime, String endTime, Nullable 1 page, Nullable 1 recordsPerPage, GridSortOptions options, Nullable 1 period, Int64[] trends, Nullable 1 allTrends) в C: \ Users \ Bruno Leonardo \ Documents \ visual studio 2010 \ Проекты \ Туманность \ Туманность \ Контроллеры \ GeneratingUnitController.cs:148 lambda_method (Closure, ControllerBase, Object []) + 543

Можете ли вы, ребята, помочь мне?

Ответы [ 4 ]

10 голосов
/ 08 июня 2011

Возможно, ошибка в том, что вы пытаетесь получить доступ к базе данных во время доступа к базе данных.Вы должны попытаться разделить два выражения Linq.Может быть, поставить что-то вроде этого:

var TimestampedList = (from t in dataContext.TrendRecords
                                         where t.TrendSetting_ID == trendSettingID
                                         select t).ToList();
TimestampedDictionary = timestampedList.ToDictionary(m => m.Timestamp,
                    m => (from j in dataContext.TrendSignalRecords
                          where j.TrendRecord_ID == m.ID
                          select j).ToDictionary(p => p.TrendSignalSetting.Name,
                    p => (double?)p.Value))
8 голосов
/ 08 июня 2011

Я предполагаю, что коннектор MySql не поддерживает MARS (несколько активных наборов результатов). В таком случае вы не можете сделать это:

L2SQuery.ToDictionary(m => m.Timestamp, m => AnotherL2SQuery)

Как только вы это сделаете, вы перечисляете результат первого запроса L2S (= DataReader все еще открыт) и выполняете второй запрос L2S для каждой записи из первой (= вам нужен второй DataReader).

Вы должны выполнить первый запрос отдельно, вызвав ToList и после этого повторить результат и построить словарь.

7 голосов
/ 30 января 2013

вызов .toList () в первом запросе

1 голос
/ 27 апреля 2017

Я тоже столкнулся с этой ошибкой сегодня.Я использовал соединение для более чем одной вещи.Вот так:

  MySqlConnection conn = new MySqlConnection(....);
  conn.Open();
  // Created a database here
  // Populdate the database there
  conn.Close();

Но когда я открывал и закрывал соединение для каждого действия, это работало:

  MySqlConnection conn = new MySqlConnection(....);
  conn.Open();
  // Created a database here
  conn.Close();
  conn.Open();
  // Populdate the database there
  conn.Close();
...