Запрос Linq возвращает неправильный набор результатов

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

Encoding.ASCII.GetString()

для строк и

BitConverter.ToInt32()

для целых чисел.

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

6
задан Bob Mc 21 December 2009 в 16:09
поделиться

7 ответов

Что ж, после некоторых разговоров с очень полезным представителем службы поддержки от Microsoft мы наконец пришли к источнику проблемы. И, к сожалению, я не предоставил достаточно информации в моем исходном сообщении, чтобы кто-либо из присутствующих на SO мог принять решение, поэтому приношу свои извинения в этом отношении.

Вот в чем проблема - как часть кода, который создает рассматриваемый запрос LINQ, я объявил переменную .Net следующим образом:

Dim RadCvtFactor As Decimal = Math.PI / 180

Оказывается, когда это передается в SQL, объявление параметра, как видно из файла журнала LINQ, является DECIMAL (29, 4). Из-за значения масштаба в объявлении в СУБД передается недопустимое значение, что приводит к странной разнице в результатах запроса.

Объявление переменной .Net как одиночного значения, например:

Dim RadCvtFactor As Single = Math.PI / 180

полностью устраняет проблему .

2
ответ дан 16 December 2019 в 21:41
поделиться

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

1
ответ дан 16 December 2019 в 21:41
поделиться

Я бы начал с просмотра вашего DataContext. Если ваш DataContext не обновляется с SQL Server, возможно, вы возвращаете более старую версию таблицы.

DataContext поддерживает состояние базы данных при ее создании. Вы хотите использовать свежий контекст для каждого набора операций.

1
ответ дан 16 December 2019 в 21:41
поделиться

Вы можете использовать DebuggerWriter для проверки фактического SQL, отправленного на сервер.

1
ответ дан 16 December 2019 в 21:41
поделиться

Другая возможность - это уровень изоляции и характер данных. Вы используете REPEATABLE READ или READ UNCOMMITTED или SNAPSHOT под Linq? А как насчет использования SSMS? Очевидно, что если данные перемещаются, слабый уровень изоляции позволит вам пропускать строки, читать некоторые строки дважды, видеть старую версию строки и т. Д.

Кроме того, не могли бы вы дать нам немного лучшее представление о том, что " очень сложный запрос "как выглядит? Вам не нужно использовать настоящие имена таблиц.

1
ответ дан 16 December 2019 в 21:41
поделиться
qry.ToList()

Этот оператор создает и возвращает нужный список. Вам нужно присвоить результат чему-то (например, локальной переменной), если вы хотите использовать список позже.

Изменить: спасибо за обновление.

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

Dim db as MyDataContext = MyGetDataContextHelper()

Этот метод подключается к той же базе данных, что и та, к которой вы подключались при использовании sql studio?

  • Проверьте свойство Connection для datacontext.
  • Убедитесь, что запрос отправлен в базу данных, наблюдая за ним с помощью профилировщика sql.
  • Выполните очень простой запрос и убедитесь, что он возвращает правильные результаты.
1
ответ дан 16 December 2019 в 21:41
поделиться

Это может показаться глупым, но всегда полезно проверить, подключаетесь ли вы к той же среде базы данных в SSMS, что и из своего приложения? :)

1
ответ дан 16 December 2019 в 21:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: