我遇到刷新时插入重复项的问题。我们这里的团队决定在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中存在空值时,这不起作用。
答案 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
冲洗并重复和重构:)