0

我在使用一些全文搜索查询时遇到了奇怪的行为,尤其是那些包含多个单词的查询。这些在通过 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 执行时返回数据。我直接从跟踪日志中复制/粘贴了这些查询。

在代码方面,我使用的是企业库,但总的来说我的数据库调用非常简单:

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 查询执行不同,我们将不胜感激。

谢谢,

安东宁

4

1 回答 1

1

好的,这很有趣。我进行了更多调试,发现 dataReader.HasRows 属性不准确 - 出于某种原因,即使结果视图集合中有数据,在某些情况下也将其设置为 false。

我想知道 reader.HasRows 是否在某种程度上依赖于客户端应用程序和服务器之间传输的数据量 - 所以在大量数据的情况下,一旦调用 ExecuteReader 方法,这个属性就不会立即更新。

无论如何,只需删除对 reader.HasRows 的检查即可解决此问题。

于 2009-10-14T08:59:20.640 回答