Взгляните на эти два вопроса:
-- #1
SELECT * FROM my_table
WHERE CONTAINS(my_column, 'monkey')
-- #2
SELECT * FROM my_table
WHERE CONTAINS(my_column, 'a OR monkey') -- "a" is a noise word
ЗапроС# 1 возвращает 20 строк, когда я запускаю его в Management Studio.
Запрос № 2 возвращает те же 20 строк, но я также вижу на вкладке "Сообщения" следующее:
Информационное: условие полнотекстового поиска содержит слово шума.
До сих пор так скучно - именно то, что я ожидал бы.
Теперь посмотрим на этот фрагмент С#:
using (SqlConnection conn = new SqlConnection(...))
{
SqlCommand cmd = conn.CreateCommand();
// setup the command object...
conn.Open();
using (SqlDataReader dr = cmd.ExecuteReader())
{
if (dr.HasRows)
{
// get column ordinals etc...
while (dr.Read())
{
// do something useful...
}
}
}
}
Когда я запускаю этот код по запросу # 1, все ведет себя так, как ожидалось, секция "делать что-то полезное" попадает для каждой из 20 строк.
Когда я запускаю его против запроса №2, ничего не происходит - раздел "сделать что-то полезное" никогда не достигается.
Теперь, когда вещи становятся немного интереснее...
Если я удалю проверку HasRows
, тогда все будет работать так, как ожидалось, секция "сделать что-то полезное" попадет для каждой из 20 строк, независимо от того, какой запрос используется.
Похоже, что свойство HasRows
неправильно заполнено, если SQL Server генерирует сообщение. Результаты возвращаются и могут быть повторены с помощью метода Read()
, но свойство HasRows
будет ложным.
Является ли это известной ошибкой в .NET и/или SQL Server, или я пропустил что-то очевидное?
Я использую VS2008SP1,.NET3.5SP1 и SQL2008.
EDIT: Я понимаю, что мой вопрос очень похож на этот, и это почти наверняка является проявлением той же проблемы, но этот вопрос увяз в течение трех месяцев без окончательного ответа.