2010-03-15 2 views
7

Я получаю следующее сообщение об ошибке, когда мой код создает DataTableReader от действительного DataTable объекта: «DataTableReader является недействительным для текущего DataTable" TempTable»DataTableReader недопустим для текущего DataTable «TempTable»

Дело в том, что если я перезагружу свою машину, она отлично работает в течение неопределенного промежутка времени, а затем умирает с вышеуказанным. Код, который генерирует эту ошибку, мог работать нормально в течение нескольких часов, а затем: bang. вы получите эту ошибку. Не ограничивается одной строкой; это каждое место, в котором используется DataTableReader. Кроме того, эта ошибка НЕ ​​происходит на веб-сервере производства - когда-либо.

Это заставляло меня остывать в течение большей части недели, и мне не удалось найти что-либо в Google, которое могло бы помочь (поскольку я довольно уверен, это не проблема с кодировкой).

Некоторые техническая информация:

DEV Box: 32-разрядные Vista (со всеми текущими обновлениями Windows) Visual Studio 2008 v9.0.30729.1 SP Dotnet Framework 3.5 SP1

SQL Server: Microsoft SQL Server 2005 Standard Edition - 9.00.4035.00 (X64) Windows 2003 64bit (со всеми текущими обновлениями окон)

Веб-сервер: Windows 2003 64bit (со всем текущим ветром ws)

Любая помощь, идеи или советы были бы с благодарностью!

UPDATE 1:

Ok - Пытался следующий теперь без успеха:

1: Rebooted 2: SFC/SCANNOW 3: Измененный SQL сервера 4: Пробовал другой метод, который использует DataTableReaders 5: Очищенный раствор

Единственное, что я нашел, что работал, была копией & вставки кода из основного экземпляра Visual Studio, в другой, который был Simp le console app. Это тогда работал, как ожидалось (запрашивается база данных и получила результаты в DataTable, создал DataTableReader этой таблицы, затем запрашивается hasrows перед вызовом .read() ... Все это работало.

Я изо всех сил, чтобы увидеть что может привести к этому, так как нет ошибок коды - я 100% уверен, что он отлично работает, когда опубликовано на веб-сервер

+0

(Предполагая, что локальный сервер SQL размещен локально) является ли ваш локальный диск низким по пространству? –

+0

Хороший вопрос, и один я не проверял ... но, увы, у меня есть акров свободного места на каждом диске (точнее, 817 ГБ) – Sk93

+0

Я попробовал рекомендацию коллег об очистке «C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files ", но он не существовал в первую очередь. Я также попытался удалить проверку «HasRows» и просто сделать While (tr.Read()), и это все еще вызывает такую ​​же ошибку. И, наконец, на 100% устранить вероятность, я попытался использовать блок и по-прежнему получаю ту же ошибку. – Sk93

ответ

7

я.. подумайте, используя while (reader.read()) может решить вашу проблему.

if (myReader.HasRows) 
    while (myReader.Read()) 
    Console.WriteLine("\t{0}\t{1}", myReader.GetInt32(0), myReader.GetString(1)); 
else 
    Console.WriteLine("No rows returned."); 
myReader.Close(); 

UPDATE: Кроме того, из MSDN: Свойство HasRows возвращает информацию о текущем наборе результатов.Если DataTableReader содержит несколько наборов результатов, вы можете проверить значение свойства HasRows сразу после вызова метода NextResult, чтобы определить, содержит ли новый результирующий набор строки.

Используйте свойство HasRows, чтобы избежать необходимости вызова метода Read DataTableReader, если в текущем наборе результатов нет строк.

DataTableReader.HasRows Property

+0

У меня создалось впечатление, что ОП сказал, что это был вызов HasRows, который терпел неудачу? –

+0

Исправить. в вашем примере (myReader.HasRows) - это строка, которая бросает исключение. – Sk93

1

Wrap использования DataTableReader (и все IDisposables) с using

+0

это не поможет. Я создаю объект, закрываю объект и удаляю объект .. как показано в приведенном выше примере кода. – Sk93

+0

Это поможет избежать других проблем - если исключения произойдут до закрытия читателя, они останутся незакрытыми. Использование инструкций может помочь избежать этого. –

+0

Это не совсем так. Если он выбрасывает исключение и выходит за рамки, то он будет закрыт и утилизирован через сборщик мусора, как обычно. Но да, использование оператора является лучшим способом продвижения вперед, и я обычно использую их. Однако этот код является «старым» кодом, написанным другим разработчиком .. и он работал нормально. Спасибо за указатель, но то, что я здесь, является решением проблемы подробно ... Надеюсь, вы понимаете :) – Sk93

1

OK .. Дальше в коде, у меня есть следующий код:

using (DataTableReader tr = dtCustomers.CreateDataReader()) 
{ 
    .... 
} 

Если я изменить следующим образом:

using (DataTableReader tr2 = dtCustomers.CreateDataReader()) 
{ 
    .... 
} 

Тогда, и помните, что это бит кода намного позже в той же самой процедуре, BOTH бит кода работает без сбоев!

Таким образом, это не работает:

using (DataTableReader tr = dt.CreateDataReader()) 
{ 
    ... 
} 

.... 

using (DataTableReader tr = dt.CreateDataReader()) 
{ 
    ... 
} 

Но это делает:

using (DataTableReader tr = dt.CreateDataReader()) 
{ 
    ... 
} 

.... 

using (DataTableReader tr2 = dt.CreateDataReader()) 
{ 
    ... 
} 

Я не понимаю, почему этот способ работает, но он делает, и как я не имел другой ответ, я пойду с этим.

Если вы знаете, почему это работает, и почему оригинал этого не делает, пожалуйста, вы можете просветить меня? :)

1

Просто подумал, что я отправлю здесь, если это поможет кому-то другому. Я попробовал несколько вещей, и в конце концов я просто изменил имя datareader, и он сработал, вроде как здесь. Я не знаю, почему точно, но я думаю, что это может быть потому, что datareader (изначально) не был закрыт, поэтому, возможно, после нескольких раз отладки было много «вещей» в памяти с определенным именем, и он сказал «не более !». все же, я мог говорить о колпиях. мой совет, измените имя вашей переменной datareader и убедитесь, что вы ее закрыли после ее использования.

+1

Добро пожаловать в SO и спасибо за сообщение. Я думаю, что пост, однако, лучше подходит для комментария, а не для ответа. Посмотрите на [Как ответить] (http://stackoverflow.com/questions/how-to-answer), это может помочь. –

1

Кажется, что ошибка при получении tableReader ... У меня есть код, который работает для ушей, и если я изменяю другой метод иногда я получаю этот errro ... несколько раз он решается просто перекомпилировать (перестроить), еще раз я переустановил .NET framework или воспользовался возможностью его восстановления ... Я начинаю ставить разделы try catch, чтобы использовать читателя, если система «хочет» подавать читателю и DataTable, если нет. Приветствия.

4

Имел ту же проблему и избавился от нее после очистки переменных в окне часов.

+0

'Clear Watch Window' фактически разрешил это ... Странно !! Благодаря.. – Shubh

2

Очистка окна часов & Выполнение перестроек работало для меня. Однако, поскольку мне приходилось не забывать часто перестраивать, я в итоге просто переименовал его. (до переименования добавление дополнительных переменных наблюдения в объект может привести к тому, что предыдущие наблюдаемые переменные на этом объекте станут недействительными - даже без прохождения кода, то есть оставаясь в одной строке)

Смежные вопросы