SQL查询返回null而不是1或0

时间:2014-09-18 13:43:47

标签: sql printing

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;
}

1 个答案:

答案 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注入攻击开放,但最好还是避免动态生成参数,而是遵循最佳实践。