【问题标题】:How to write the IFEXISTS condition and update the record from the codebehind?如何编写 IF EXISTS 条件并从后面的代码更新记录?
【发布时间】:2011-08-01 04:48:42
【问题描述】:

我想写一个 IFEXISTS 条件并从后面的代码更新记录我不知道它是否可能......

如果可能的话,请告诉我它的语法..

如何更新记录..

我想写这样的东西..但是什么是正确的?

public void UpdateModalitiesId(int? CaseId, int ModalitiesId)

    {
        string query = "if exists (select count(*) from ImageModality where ImageModality.Id='"+ ModalitiesId +"')
                               UPDATE ImageGroup set ImageModalityId='" + ModalitiesId + "' where BaseCaseId='" + CaseId +"' ;
        //string query = "UPDATE ImageGroup set ImageModalityId='" + ModalitiesId + "' where BaseCaseId='" + CaseId + "'";
        SqlHelper.ExecuteNonQuery(strConnectionString, CommandType.Text, query);
    }

【问题讨论】:

  • 为什么int值用单引号括起来?
  • 那不是问题,我可以删除它,但对我来说是小鬼。是查询如何写..
  • 附带说明,您应该考虑使用SqlParameters 将变量注入SQL 而不是字符串连接。如果 CaseIdModalitiesId 被渲染为不安全,该代码就会受到 SQL 注入攻击。

标签: c# asp.net sql-server-2008


【解决方案1】:

首先,语句 select count(*) 将始终返回至少一条记录,因此您的条件将始终返回 TRUE。所以你需要像

这样的条件
IF (Select count(*) FROM ...) > 0 

接下来,如果您需要使用您的条件更新记录,您可以使用 IF .. BEGIN .. END 语句。不一定要用BEGIN .. END,你可以在IF条件后立即用你的UPDATE,但以后如果你要修改你的代码,你可以避免逻辑错误。

所以,你的代码会是这样的:

public void UpdateModalitiesId(int? CaseId, int ModalitiesId)

    {
        string query = "if (select count(*) from ImageModality where ImageModality.Id='"+ ModalitiesId +"') > 0 BEGIN
                               UPDATE ImageGroup set ImageModalityId='" + ModalitiesId + "' where BaseCaseId='" + CaseId +"; END' ;
        SqlHelper.ExecuteNonQuery(strConnectionString, CommandType.Text, query);
    }

编辑:正确的代码是

public void UpdateModalitiesId(int? CaseId, int ModalitiesId)

    {
        string query = "if EXISTS(select * from ImageModality where ImageModality.Id='"+ ModalitiesId +"') 0 BEGIN
                               UPDATE ImageGroup set ImageModalityId='" + ModalitiesId + "' where BaseCaseId='" + CaseId +"; END' ;
        SqlHelper.ExecuteNonQuery(strConnectionString, CommandType.Text, query);
    }

【讨论】:

  • 更好的是IF EXISTS(SELECT *... - 使用COUNT(*) 可能 导致数据库实际计算所有行,而EXISTS(SELECT *... 应该在找到匹配项后立即终止行。
  • 关于 EXIST 和 COUNT,我完全同意你的看法。在我的解决方案中,我只是修复了 EXISTS 和 COUNT 一起使用时的错误。 EXIST (SELECT COUNT (*)),正如问题中所写,总是返回 TRUE,我刚刚修复了它。好的,让我们修正一下我的答案...
【解决方案2】:

就个人而言,我会考虑不先测试,而只是进行更新

两者都需要对基本相同的 SELECT..WHERE... 进行 2 次表触摸

因此,仅更新意味着如果没有行,则更新零行。 A并且桌子被tiuched一次

也有可能在 EXISTS 之后但在 UPDATE 之前在重负载下插入该行。

【讨论】:

    【解决方案3】:

    您可以在这些行中查看一些内容

    IF EXISTS(SELECT count(*) from ImageModality where ImageModality.Id= ID > x)
    BEGIN     
         UPDATE ImageGroup set ImageModalityId ....
    END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      相关资源
      最近更新 更多