IF EXISTS (SELECT 1 FROM [dbo].[permissions] WHERE [dbo].[permissions].[fk_sites_recid] = {0})
PRINT 1 ELSE PRINT 0
我想知道表中是否存在特定记录,并且看到类似于上面的查询,该查询应返回0或1。
它过去曾为我工作,但现在不行。
如果我在sql management studio中运行它,它会按预期返回1或0,但是从我的c#应用程序运行它,无论是否存在具有该值的fk_sites_recid,它都返回null。我已尝试使用datareader和标量结果返回null的相同查询。任何人都可以想到,如果某个地方出现奇怪的事情会导致这种情况发生吗? 在数据迁移的整个生命周期中,我的连接和事务处于打开状态,事务(我认为)是在sql management studio和我的.net应用程序中运行它的唯一不同之处。< / p>
if (found)
{
// Does it already exist? if so, don't re-add
string sql = string.Format(@"IF EXISTS (SELECT 1 FROM [dbo].[permissions]
WHERE [dbo].[permissions].[fk_sites_recid] = {0})
PRINT 1 ELSE PRINT 0", destRow.fk_Sites_RecID);
using (var command = GetCommand(sql))
{
object o = command.ExecuteScalar(); // <- returns null here
if (o.ToString() != "0")
continue;
}
using (var command = GetCommand(sql))
{
using (var reader = command.ExecuteReader())
{
while (reader.Read()) // <- reader doesn't read anything here
{
object o = reader[0];
}
}
}
}
protected SqlCommand GetCommand(string sql)
{
var result = new SqlCommand(sql, Connection, Transaction);
return result;
}
答案 0 :(得分:2)
当您致电PRINT
时,它会向客户端返回自定义消息,但不会将数据返回给您的数据读取器。您应该使用PRINT
:
SELECT
SELECT
CASE WHEN EXISTS (SELECT 1 FROM [dbo].[permissions] WHERE [dbo].[permissions].[fk_sites_recid] = {0})
THEN 1
ELSE 0
END as SomeField
考虑为fk_Sites_RecID
使用命名参数。尽管在这个特定的实例中你看起来并不像是对SQL注入攻击开放,但最好还是避免动态生成参数,而是遵循最佳实践。