我有一个人们用来更新数据库中记录的形式视图。但最初记录不存在,所有字段将显示其默认值。首次单击提交按钮时,应该在数据库中创建记录。后续提交应更新现有记录。记录由它的主键标识,通过Request.QueryString传递给页面。ASP.net - 插入记录,如果没有,
不ASP.net提供这样的一个简单的办法,或者我需要推出自己的执行插入/更新的逻辑?
我有一个人们用来更新数据库中记录的形式视图。但最初记录不存在,所有字段将显示其默认值。首次单击提交按钮时,应该在数据库中创建记录。后续提交应更新现有记录。记录由它的主键标识,通过Request.QueryString传递给页面。ASP.net - 插入记录,如果没有,
不ASP.net提供这样的一个简单的办法,或者我需要推出自己的执行插入/更新的逻辑?
UPDATE dbo.table SET col = @col WHERE id = @id;
IF @@ROWCOUNT = 0
BEGIN
INSERT dbo.table(id, col) SELECT @id, @col;
END
在2008+你也可以使用MERGE
但我发现的语法相当艰巨(和它不会从潜在的冲突隔离你,以及你可能会认为它)。
我最终这样做了,尽管我认为有必要在事务中使用“set transaction isolation level serializable”。否则,两个线程可以同时执行update语句,并且都会接收@@ rowcount = 0(如果记录还没有出现),这会导致一个线程在插入时获得PK违例。 – Trent
阅读的价值,做一个GET请求到数据源/ Repositary。检查此密钥是否已存在实体/记录。如果是,请调用Update方法,否则插入。
像这样的事情
//check the queystring param value is valid numeric expression
//before trying to convert
int itemId=Convert.ToInt32(Request.QueryString["itemId"]);
var item=repo.GetItemById(itemId);
if(item==null)
{
repo.InsertItem(item);
}
else
{
repo.UpdateItem();
}
假设repo
是你Repositary实现的一个目标,你必须出现在插入和UupdateItem方法将做数据的更新用/插入到你的持续性存储。
如果在查询字符串的ID,你不已经知道,它需要更新? –
没有,因为我有一个一对一关系的两个表。它们共享相同的密钥,但如果用户选择填写一个特定的形式记录在其他表对只会存在。 – Trent