C# 如何快速删除然后将多个记录插入数据库
我有一个ASP.NET web应用程序,需要一次删除和插入多条记录 假设用户点击了一个按钮。它将删除此用户的所有现有记录,并将一组新记录插入数据库 例如,用户A在数据库中有720条记录。当用户单击Update按钮时,它将删除现有的700条记录,并将一组新记录(比如854条记录)插入数据库 用户将经常使用此功能 我计划这样做:C# 如何快速删除然后将多个记录插入数据库,c#,asp.net,sql-server-2008,C#,Asp.net,Sql Server 2008,我有一个ASP.NET web应用程序,需要一次删除和插入多条记录 假设用户点击了一个按钮。它将删除此用户的所有现有记录,并将一组新记录插入数据库 例如,用户A在数据库中有720条记录。当用户单击Update按钮时,它将删除现有的700条记录,并将一组新记录(比如854条记录)插入数据库 用户将经常使用此功能 我计划这样做: 删除用户的所有记录 将所有记录存储在集合中 使用foreach循环整个集合并逐个插入记录 但我担心可能存在性能问题 是否有更好的方法执行此操作?您只需在执行插入之前删除用户
foreach
循环整个集合并逐个插入记录是否有更好的方法执行此操作?您只需在执行
插入之前删除
用户记录:
为什么不作为数据库操作执行此操作(在插入用户记录之前运行此代码):
关于插入记录的最快方法,您可以找到许多帖子:
在执行插入之前,您只需删除用户记录:
为什么不作为数据库操作执行此操作(在插入用户记录之前运行此代码):
关于插入记录的最快方法,您可以找到许多帖子:
您可以使用类似ORM的实体框架,它支持批量更新
使用实体框架,您可以按以下方式执行:
MyEntities dbContext = new MyEntities();
dbContext.Users.Add(new User(){Name="User1"});
dbContext.Users.Add(new User(){Name="User2"});
dbContext.SaveChanges();
要使用实体框架删除所有记录,请执行以下操作:
dbContext.Database.ExecuteSqlCommand("delete from User");
您可以在一批中进行所有更改:
//get all or needed users
List<User> users = dbContext.Users.ToList();
foreach (var user in users)
{
if (CheckCondition) //update user
{
user.Name = "new name";
dbContext.Entry(user).State = EntityState.Modified;
}
else if (CheckCondition) // delete user
{
dbContext.Entry(user).State = EntityState.Deleted;
}
}
dbContext.Users.Add(new User() {Name = "Name3"}); //add new user
dbContext.SaveChanges(); //save all changes in one batch in a single transaction
//获取所有或需要的用户
List users=dbContext.users.ToList();
foreach(用户中的var用户)
{
if(CheckCondition)//更新用户
{
user.Name=“新名称”;
dbContext.Entry(user.State=EntityState.Modified;
}
else if(CheckCondition)//删除用户
{
dbContext.Entry(user.State=EntityState.Deleted;
}
}
添加(新用户(){Name=“Name3”})//添加新用户
dbContext.SaveChanges()//在单个事务中保存一批中的所有更改
您可以使用类似ORM的实体框架,它支持批量更新
使用实体框架,您可以按以下方式执行:
MyEntities dbContext = new MyEntities();
dbContext.Users.Add(new User(){Name="User1"});
dbContext.Users.Add(new User(){Name="User2"});
dbContext.SaveChanges();
要使用实体框架删除所有记录,请执行以下操作:
dbContext.Database.ExecuteSqlCommand("delete from User");
您可以在一批中进行所有更改:
//get all or needed users
List<User> users = dbContext.Users.ToList();
foreach (var user in users)
{
if (CheckCondition) //update user
{
user.Name = "new name";
dbContext.Entry(user).State = EntityState.Modified;
}
else if (CheckCondition) // delete user
{
dbContext.Entry(user).State = EntityState.Deleted;
}
}
dbContext.Users.Add(new User() {Name = "Name3"}); //add new user
dbContext.SaveChanges(); //save all changes in one batch in a single transaction
//获取所有或需要的用户
List users=dbContext.users.ToList();
foreach(用户中的var用户)
{
if(CheckCondition)//更新用户
{
user.Name=“新名称”;
dbContext.Entry(user.State=EntityState.Modified;
}
else if(CheckCondition)//删除用户
{
dbContext.Entry(user.State=EntityState.Deleted;
}
}
添加(新用户(){Name=“Name3”})//添加新用户
dbContext.SaveChanges()//在单个事务中保存一批中的所有更改
为什么不更新必要的字段?
好吧,如果您担心性能,可以使用原始查询,而不是使用大型ORM。从您的需要来看,我认为在执行删除和插入操作时最好使用事务
以下是我认为对您有用的:
为什么不更新必要的字段?
好吧,如果您担心性能,可以使用原始查询,而不是使用大型ORM。从您的需要来看,我认为在执行删除和插入操作时最好使用事务
以下是我认为对您有用的:
如果你有一组对象,那么我会:
将其放入事务中
删除
使用表值参数(TVP)插入
(并对PK上的插入进行排序,以最小化碎片)
通过TVP插入类似于反向数据读取器
如果您有原始数据,您正在解析和加载,我会说bulkcopy
但您声明您有一个收藏
一次只插入一行,插入时间少于1000,应该很快。
如果它是一个非常活跃的表,并且很难获得写锁,则会出现问题。
即使只需一个简单的插入,也可以打包多达100个值(),()。
但如果你想追求速度,我还是会选择TVP超过100的 如果你有一组对象,那么我会:
将其放入事务中
删除
使用表值参数(TVP)插入
(并对PK上的插入进行排序,以最小化碎片)
通过TVP插入类似于反向数据读取器
如果您有原始数据,您正在解析和加载,我会说bulkcopy
但您声明您有一个收藏
一次只插入一行,插入时间少于1000,应该很快。
如果它是一个非常活跃的表,并且很难获得写锁,则会出现问题。
即使只需一个简单的插入,也可以打包多达100个值(),()。
但如果你想追求速度,我还是会选择TVP超过100的 如果许多记录保持不变或只需要更新,则不需要删除-插入对。您可以将MERGE
语句与表值参数一起使用,一次在一条效率最高的语句中执行插入、更新和删除操作。这可能是最快的方法<代码>合并
经过了很好的优化,可以以最佳方式一次执行所有写入操作
我的经验是,这种技术在实践中效果很好。如果许多记录保持不变或只需要更新,则不需要删除-插入对。您可以将MERGE
语句与表值参数一起使用,一次在一条效率最高的语句中执行插入、更新和删除操作。这可能是最快的方法<代码>合并
经过了很好的优化,可以以最佳方式一次执行所有写入操作
我的经验是,这种技术效果很好