Посмотрите на эти два запроса:
-- #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 строк, но я также вижу следующее на вкладке Сообщения:
Информация: условие полнотекстового поиска содержало слово (а) с шумом.
Пока что это так скучно - именно то, чего я ожидал.
Теперь взгляните на этот фрагмент C #:
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
будет иметь значение false.
Это известная ошибка в .NET и / или SQL Server, или я пропустил что-то очевидное?
Я использую VS2008SP1, .NET3.5SP1 и SQL2008.
РЕДАКТИРОВАТЬ: Я ценю, что мой вопрос очень похож на этот , и это почти наверняка проявление той же проблемы, но этот вопрос был увяз в течение трех месяцев без однозначного ответа.