Получение бессмысленных результатов из SQL-запроса - PullRequest
2 голосов
/ 06 июня 2009

Я столкнулся с очень, очень странной ситуацией в моем приложении. Я говорю странно, потому что ошибки прерывистые , и я не могу выяснить, почему они возникают.

Я передал команду sql в БД (Sql 2005), пытаясь получить bigint (столбец ID_Facultate) из одной таблицы. Проблема в том, что у меня есть строка (название какой-то лекции), которая не имеет ничего общего с таблицей, к которой я пытался получить доступ.

Кроме того, когда я получаю эти ошибки, все мое приложение сходит с ума.

В SQL Profiler все выглядит нормально (последние выполняющиеся строки кажутся теми, что были отправлены моим приложением)

Вот несколько ссылок на 3 захваченных экрана во время ошибок и код, который я использовал. Обратите внимание на Watch1 со строковым значением очень неправильное , где я ожидал некоторое целое число

Обновление:

Я рассмотрю использование как имени столбца, так и / или ExecuteScalar.

Тем не менее, проблема в том, что, как видно из Watch1, запрос возвращает значение, которое не имеет ничего общего с этой таблицей.

Код ожидал целое число (14), в то время как БД вернула строку ... (http://www.unitbv.ro/cata/errors/2.jpg) То же самое в http://www.unitbv.ro/cata/errors/3.jpg: я ожидал значение от 1 до 20, в то время как DB / layer, похоже, возвращает значение 305, которое не в этой таблице ...

В следующем посте (на разных форумах) я задавал одинаковые или похожие вопросы (и пока нет положительного ответа)

Ответы [ 5 ]

1 голос
/ 06 июня 2009

Из вашего кода я мог думать только о получении значения, используя имя поля.

rd["ID_Facultate"].ToString()

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

0 голосов
/ 05 мая 2014

Это может быть слепой путь ... но ваш контекст - это веб-приложение? Вы используете старую версию EntLib (4 или ниже)?

В известных версиях EntLib 4 (и более ранних) существует ошибка, которая может возникнуть при большой нагрузке в контексте приложения ASP.NET, размещенного на IIS. Я не помню всех деталей, но в основном IIS имеет оптимизацию, при которой под большой нагрузкой он может «припарковать» поток во время ожидания (чтобы освободить его, чтобы его можно было использовать для чего-то другого), а затем попытаться продолжить выполнение того же потока LOGICAL в том, что фактически является другим потоком, когда время ожидания ввода-вывода закончилось.

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

Если вы не используете EntLib, проверьте, не содержит ли ваш собственный код ту же ошибку. Ищите атрибут [ThreadStatic] - они НЕ обрабатываются IIS, когда он решает перенести логику в другой поток!

Погуглите «ловкость потоков IIS», чтобы получить больше информации.

Несколько ссылок, которые могут быть полезны:

http://piers7.blogspot.no/2005/11/threadstatic-callcontext-and_02.html а также http://blog.idm.fr/2010/03/aspnet-thread-agility-or-why-threadstatic-should-not-be-used.html

0 голосов
/ 16 июля 2009

Из всего, что вы нам сказали, ничего не кажется неправильным. Вероятно, это что-то еще, о чем вы не дали нам информацию.

Некоторые другие вещи, которые нужно попробовать:

  • Выполнить DBCC CHECKDB
  • Проверка правильности результата запроса в SQL Server Management Studio
  • Попробуйте базу данных на другом компьютере / экземпляре SQL и посмотрите, не исчезнут ли те же проблемы
0 голосов
/ 06 июня 2009

Поскольку вы получаете только 1 значение обратно, вам следует рассмотреть возможность использования SqlCommand.ExecuteScalar вместо получения DataReader.

0 голосов
/ 06 июня 2009

Можете ли вы вспомнить, почему idr.FieldCount имеет значение 4 на экранах 1 и 2, но только 3 на экране 3. Может ли проблема быть решена путем использования имени столбца вместо порядкового номера?

id_faculate = long.Parse(idr["ColumnName"].ToString());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...