使用if存在

时间:2009-11-04 15:25:22

标签: c# asp.net sql-server visual-studio

我遇到刷新时插入重复项的问题。我们这里的团队决定在sql中使用'if exists'是阻止重复插入的最佳方法。但是,如果参数设置为null,该怎么办?

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

当field1中存在空值时,这不起作用。

7 个答案:

答案 0 :(得分:8)

你可以将你的字段包裹在isnull或其他东西中以考虑空值

isnull(field1, '') = isnull(@field1, '') and 
isnull(field2, '') = isnull(@field2, '') and 
isnull(field3, '') = isnull(@field, '')

答案 1 :(得分:3)

减少数据库负载并在源头攻击问题不是一个更好的主意吗?

通常当你有一个页面处理它自己的提交时会出现这种错误,即表单动作属性指向自身,所以当有人在发布内容后点击刷新时,POST数据仍然是“实时”并获得回到页面。

更好的方法是将数据提交给处理插入的第二个对象,然后重定向回到它来自的位置,重定向清除POST数据并为自己节省大量不必要的查询。

只是我的2c

答案 2 :(得分:2)

where field1 IS @field1

无效语法

使用isnull()

所以:

string cmdText = " if (not exists(select * from table where isnull(field1, '') = isnull(@field1, '') ...

答案 3 :(得分:2)

如果您不想在表中使用重复项,那么您的表应该在field1,field2和field3上具有主键或至少具有唯一的聚簇索引。

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

答案 4 :(得分:2)

以下条件会有所帮助。

field1为null或@ field1 = field1

答案 5 :(得分:2)

在字段定义中,您可以使用NOT NULL约束,以便null元素不能存在。

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

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

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, '');

如果满足这些条件,您将被允许插入。

希望我的触发器正确。 :)

答案 6 :(得分:1)

如果要将@ field1设置为NULL,则必须使用IS而不是=。对于使用相等运算符,NULL不是gonig。您需要使用等效类型“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

冲洗并重复和重构:)