代码之家  ›  专栏  ›  技术社区  ›  Eric

使用if存在

  •  0
  • Eric  · 技术社区  · 15 年前

    刷新时插入重复项时出现问题。我们的团队决定在SQL中使用“if exists”是停止重复插入的最佳方法。但是,如果参数设置为空怎么办?

    string cmdText = " if (not exists(select * from table where field1 = @field1 and field2 = @field2 and field3 = @field3)) Insert into table(field1,field2,field3) Values(@field1,@field2,@field3)";
    
    if (txtfield1.text != "")
        cmd.Parameters.Add(new SqlParameter("@field1", txtfield1.text));
    else
        cmd.Parameters.Add(new SqlParameter("@ field1", DBNull.Value));
    
        cmd.Parameters.Add(new SqlParameter("@field2", txtfield2));
        cmd.Parameters.Add(new SqlParameter("@field3", txtfield3));
    

    当字段1中存在空值时,这不起作用。

    7 回复  |  直到 15 年前
        1
  •  8
  •   Joseph    15 年前

    您可以将字段环绕IsNull或考虑空值的某些内容

    isnull(field1, '') = isnull(@field1, '') and 
    isnull(field2, '') = isnull(@field2, '') and 
    isnull(field3, '') = isnull(@field, '')
    
        2
  •  3
  •   MalphasWats    15 年前

    减少数据库的负载并在源代码处攻击问题不是更好的主意吗?

    通常,当您有一个处理自己提交的页面(即表单操作属性指向自身)时,会发生这种错误,因此当有人在发布内容后单击刷新时,发布数据仍然是“活动的”,并被发布回该页面。

    一个更好的方法是将数据提交给另一个处理插入的对象,然后将其重定向回其来源,重定向将清除发布数据,并为自己保存许多不必要的查询。

    只是我的2C

        3
  •  2
  •   eric    15 年前
    where field1 IS @field1
    

    不是有效的语法

    使用ISnull()

    所以:

    string cmdText = " if (not exists(select * from table where isnull(field1, '') = isnull(@field1, '') ...
    
        4
  •  2
  •   Danielle    15 年前

    如果您不希望在表中有重复项,可能您的表应该在字段1、字段2和字段3上有一个主键或至少一个唯一的聚集索引。

    这样,如果行已经存在,您可以尝试插入并捕获错误。

        5
  •  2
  •   Saar    15 年前

    以下情况会有所帮助。

    field1为空或@field1=field1

        6
  •  2
  •   Egon    15 年前

    在字段定义中,您可以使用非空约束,这样空元素就不会出现在那里。

    http://www.w3schools.com/SQl/sql_notnull.asp

    并使用SQL唯一约束,因此它们必须是唯一的。

    http://www.w3schools.com/SQl/sql_unique.asp

     CREATE TABLE YourTable
     (
       Field1 varchar(255),
       Field2 varchar(255),
       Field3 varchar(255),
       CONSTRAINT uc_fields UNIQUE (Field1, Field2, Field3)
     )
    
     CREATE TRIGGER table_null_convert
       ON YourTable
       FOR INSERT, UPDATE 
       REFERENCING NEW ROW AS n
       FOR EACH ROW
         SET n.Field1 = ISNULL(n.Field1, '')
         SET n.Field2 = ISNULL(n.Field2, '')
         SET n.Field3 = ISNULL(n.Field3, '');
    

    如果满足这些条件,您可以插入。

    希望我扣好扳机。:)

        7
  •  1
  •   Shaun Mundi    15 年前

    如果要将@field1设置为空,则必须使用is而不是=。空值不是用于相等运算符的角。您需要为此使用等价类型“is”。

    string cmdText = " if (not exists(select * from table where field1 = @field1 and field2 = @field2 and field3 = @field3)) Insert into table(field1,field2,field3) Values(@field1,@field2,@field3)";
    

    string cmdText = "";
    if (txtfield1.text != "") 
    cmdText = " if (not exists(select * from table where field1 = @field1 and field2 = @field2 and field3 = @field3)) Insert into table(field1,field2,field3) Values(@field1,@field2,@field3)";
    else
    cmdText = " if (not exists(select * from table where field1 IS @field1 and field2 = @field2 and field3 = @field3)) Insert into table(field1,field2,field3) Values(@field1,@field2,@field3)";
    end if
    

    冲洗、重复和重构:)