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.
编辑:我很欣赏我的问题与这个问题非常相似,几乎可以肯定是同一个问题的表现,但这个问题陷入了三个月的困境,没有明确的答案.
我是推荐问题(丢失登录)的原始海报,从未设法弄明白.最后,我把它归结为糟糕的伏都教,牺牲了整洁,并采取了类似的东西
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现在是正确的.
这当然是奇怪的行为 - 但我想知道为什么您需要检查HasRows
是否要简单地迭代结果集。
该HasRows
属性封装了一个_hasRows
字段,该字段由于多种不同的原因被设置在许多不同的地方true
或false
内部。SqlDataReader
在大多数地方,true
如果 privateTdsParserStateObject
的PeekByte
方法返回一个指示数据存在的数字,则将其设置为该值。