在针对SQL Server 2008运行时,SqlDataReader.HasRows中是否存在错误?

Luk*_*keH 20 .net sql sql-server ado.net sql-server-2008

看看这两个查询:

-- #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
Run Code Online (Sandbox Code Playgroud)

当我在Management Studio中运行时,查询#1返回20行.
查询#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...
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我针对查询#1运行此代码时,所有内容都按预期运行 - 为20行中的每一行命中"执行一些有用的"部分.

当我针对查询#2运行它时,没有任何反应 - 从未达到"做有用的事情"部分.

现在这里的事情变得更有趣......

如果我删除了HasRows检查,那么一切都按预期工作 - 无论使用哪个查询,20行中的每一行都会点击"做一些有用的"部分.

HasRows如果SQL Server生成消息,似乎没有正确填充该属性.返回结果并可以通过使用Read()方法迭代但HasRows属性将为false.

这是.NET和/或SQL Server中的已知错误,还是我错过了一些明显的错误?
我正在使用VS2008SP1,.NET3.5SP1和SQL2008.

编辑:我很欣赏我的问题与这个问题非常相似,几乎可以肯定是同一个问题的表现,但这个问题陷入了三个月的困境,没有明确的答案.

ctr*_*3nd 6

我是推荐问题(丢失登录)的原始海报,从未设法弄明白.最后,我把它归结为糟糕的伏都教,牺牲了整洁,并采取了类似的东西

bool readerHasRows=false;
while(reader.reader())
{
   readerHasRows=true;
   doStuffOverAndOver();
}
if (!readerHasRows)
{
   probablyBetterShowAnErrorMessageThen();
}
Run Code Online (Sandbox Code Playgroud)

真正奇怪的是它在一个aspx页面中工作而在另一个aspx页面中没有,尽管代码块几乎完全相同,但是使用的存储过程也是如此.

毋庸置疑我从现在开始避免.HasRows;)

编辑 - Management Studio也会在项目中的问题过程的消息选项卡中显示消息.所以这似乎是问题的原因.但是为什么它会起作用.HasRows ??

EDIT2 - 确认,更改了查询以避免警告消息和.hasrows现在是正确的.


And*_*are 2

这当然是奇怪的行为 - 但我想知道为什么您需要检查HasRows是否要简单地迭代结果集。

HasRows属性封装了一个_hasRows字段,该字段由于多种不同的原因被设置在许多不同的地方truefalse内部。SqlDataReader在大多数地方,true如果 privateTdsParserStateObjectPeekByte方法返回一个指示数据存在的数字,则将其设置为该值。