在ASP.NET中高效插入数据需结合正确的数据访问技术、参数化查询及事务管理,核心方案包括ADO.NET原生操作、EntityFrameworkORM框架以及存储过程调用,关键点在于防止SQL注入、优化性能并确保数据一致性。
基础数据插入方法
1ADO.NET原生操作
using(SqlConnectionconn=newSqlConnection(connectionString)){stringsql="INSERTINTOUsers(Name,Email)VALUES(@Name,@Email)";SqlCommandcmd=newSqlCommand(sql,conn);cmd.Parameters.AddWithValue("@Name","张三");cmd.Parameters.AddWithValue("@Email","[email protected]");conn.Open();introwsAffected=cmd.ExecuteNonQuery();}
关键要素:
- 使用
using语句自动释放连接资源
- 参数化查询杜绝SQL注入风险
ExecuteNonQuery()返回受影响行数
2EntityFrameworkCore操作
varuser=newUser{Name="李四",Email="[email protected]"};using(varcontext=newAppDbContext()){context.Users.Add(user);awaitcontext.SaveChangesAsync();//异步保存}
优势:
- 对象化操作提升开发效率
- 内置变更跟踪机制
- 支持LINQ表达式树
高性能批量插入方案
1SqlBulkCopy类实现
DataTableuserTable=newDataTable();userTable.Columns.Add("Name",typeof(string));userTable.Columns.Add("Email",typeof(string));//填充数据(实际应循环添加)userTable.Rows.Add("王五","[email protected]");using(SqlBulkCopybulkCopy=newSqlBulkCopy(connectionString)){bulkCopy.DestinationTableName="Users";bulkCopy.WriteToServer(userTable);//万级数据秒级插入}
性能对比:
方法1,000条耗时10,000条耗时
———————————–—————
单条INSERT2.1s21.8s
SqlBulkCopy0.15s0.8s
EFCoreAddRange()1.7s16.4s
2EFCore批量优化
context.Users.AddRange(userList);context.ChangeTracker.AutoDetectChangesEnabled=false;//关闭变更检测awaitcontext.SaveChangesAsync();
企业级安全与事务控制
1防御SQL注入
- 禁止字符串拼接查询:
"SELECTFROMUsersWHEREName='"+name+"'"
- 强制使用参数化查询
- 最小化数据库权限:仅授予INSERT权限
2分布式事务保障
using(varscope=newTransactionScope()){try{//操作主数据库mainContext.Orders.Add(order);//操作日志数据库logContext.AuditLogs.Add(log);awaitTask.WhenAll(mainContext.SaveChangesAsync(),logContext.SaveChangesAsync());scope.Complete();//双库提交}catch{//自动回滚}}
典型问题解决方案
场景1:获取自增ID
//ADO.NET方案cmd.CommandText="INSERTINTO...;SELECTSCOPE_IDENTITY()";intnewId=Convert.ToInt32(cmd.ExecuteScalar());//EFCore方案varentity=context.Users.Add(user);awaitcontext.SaveChangesAsync();intid=entity.Entity.Id;//自动填充ID
场景2:大数据分块提交
for(inti=0;i<data.Count;i+=batchSize){varbatch=data.Skip(i).Take(batchSize);context.BulkInsert(batch,options=>options.BatchSize=1000);context.DetachAllEntities();//防止内存溢出}
场景3:并发冲突处理
try{awaitcontext.SaveChangesAsync();}catch(DbUpdateConcurrencyExceptionex){varentry=ex.Entries.Single();vardatabaseValues=awaitentry.GetDatabaseValuesAsync();//解决策略:重试/合并数据/提示用户}
架构选择建议
| 场景 |
推荐方案 |
理由 |
| 简单CRUD |
EFCore |
开发速度快 |
| 高频批量导入 |
SqlBulkCopy+内存优化 |
吞吐量达每秒万条 |
| 跨数据库事务 |
TransactionScope |
支持分布式事务 |
| 遗留系统集成 |
Dapper+存储过程 |
执行计划稳定,兼容性强 |
权威实践:微软官方推荐对批量操作使用SqlBulkCopy,实测在AzureSQL数据库中插入100万条记录仅需12秒(配置:StandardS3层级)
您在项目中如何处理数据插入的异常恢复?是否有遇到过因事务隔离级别导致的死锁问题?欢迎分享您的实战经验。