Читателю не возвращены результаты, но тот же запрос работает через SQL Management Studio - PullRequest
0 голосов
/ 13 октября 2009

Я испытываю странное поведение с некоторыми полнотекстовыми поисковыми запросами, особенно с несколькими словами. Они работают нормально, когда выполняются через Management Studio, но не возвращают результатов при вызове из кода. Я сделал трассировку SQL, чтобы увидеть, какие команды отправляются из моего приложения, и точно такая же команда приходит с результатами при выполнении из Management Studio, но без результатов при вызове из моего приложения методом ExecuteReader.

Этот звонок:

exec dbo.FullTextSearch_Articles @ftsQuery=N' FORMSOF (INFLECTIONAL, moravec) '

вернет данные как для моего приложения, так и для Management Studio, пока эта команда:

exec dbo.FullTextSearch_Articles @ftsQuery=N'( FORMSOF (INFLECTIONAL, jan)  AND  FORMSOF (INFLECTIONAL, moravec) )'

вернет данные только при выполнении из Management Studio. Я копирую / вставляю эти запросы прямо из журнала трассировки.

Что касается кода, я использую Enterprise Library, но в целом мой вызов БД очень прост:

using (var dataReader = (SqlDataReader)db.ExecuteReader(cmd))
{
   if (dataReader.HasRows)
   {
       var results = new List<IFullTextSearchItem>();
       while (dataReader.Read())
       {
          results.Add(CreateArticleSearchFromReader(dataReader));
       }
       return results;
    }
    return null;
}

Во втором случае dataReader.HasRows по некоторым причинам имеет значение false, но, опять же, когда эти запросы выполняются из Management Studio, оба возвращают некоторые данные.

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

Любая идея, почему DataReader будет вести себя иначе, чем простое выполнение запроса Management Studio, будет принята.

Спасибо,

Антонин

1 Ответ

1 голос
/ 14 октября 2009

ОК, это интересно. Я сделал немного больше отладки и обнаружил, что свойство dataReader.HasRows не является точным - по какой-то причине для него установлено значение false в некоторых случаях, даже если в коллекции представления результатов есть данные.

Интересно, является ли reader.HasRows каким-либо образом зависимым от объема данных, передаваемых между клиентским приложением и сервером - поэтому в случае lot данных это свойство не обновляется сразу, как только метод ExecuteReader называется.

В любом случае, просто убрав проверку читателя. HASRows решает эту проблему.

...