在c#中 sqlserver大量插入数据解决方式
1、SqlBulkCopy介绍
SqlBulkCopy是.NET中的一个包,用于将大批量数据添加到sqlserver数据库中,相比逐行插入它的速度更快,并且支持分批处理,失败事务回滚、设置延迟等。
2、SqlBulkCopy使用
这里封装了一个公共方法,用于将指定的数据插入到表中。
/// <summary>
/// 使用SqlBulkCopy批量添加数据
/// </summary>
/// <param name=”connStr”>数据库连接字符串</param>
/// <param name=”tableName”>表名</param>
/// <param name=”datas”>数据</param>
/// <param name=”batchSize”>大小</param>
/// <param name=”timeout”>延迟</param>
public void BulkInsert<T>(string connStr, string tableName, IEnumerable<T> datas, int batchSize, int timeout)
{
var dataList = new List<T>(datas);
while (dataList.Count > 0)
{
// 计算当前批次的实际大小
int currentBatchSize = Math.Min(batchSize, dataList.Count);
// 获取当前批次的数据
List<T> batchData = dataList.GetRange(0, currentBatchSize);
using (var conn = new SqlConnection(connStr))
{
// 打开连接
conn.Open();
// 开始事务
SqlTransaction tran = conn.BeginTransaction();
try
{
// 创建 SqlBulkCopy 实例,并进行设置
using (var bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, tran))
{
bulkCopy.DestinationTableName = tableName;
bulkCopy.BatchSize = batchSize;
bulkCopy.BulkCopyTimeout = timeout;
// 启用流式传输
bulkCopy.EnableStreaming = true;
var properties = typeof(T).GetProperties().OrderBy(p => p.MetadataToken).ToArray();
foreach (var prop in properties)
{
bulkCopy.ColumnMappings.Add(prop.Name, prop.Name);
}
// 使用ObjectReader流式读取数据
using (var reader = ObjectReader.Create(batchData))
{
bulkCopy.WriteToServer(reader);
}
}
// 提交事务
tran.Commit();
// 成功提交后移除当前批次的数据
dataList.RemoveRange(0, currentBatchSize);
}
catch
{
// 发生异常时回滚事务
tran.Rollback();
throw;
}
}
}
}
注意:在Modal中申明的实体需要和表中的顺序一一对应
举个例子:
Modal中定义User:
public class User
{
public Guid UserId { get; set; }
public string Username { get; set; }
public string Hobby { get; set; }
}
var users = new List<User>(){
new User(){UserId = Guid.NewGuid(), Username = “小一”, Hobby = “旅游”},
new User(){UserId = Guid.NewGuid(), Username = “小二”, Hobby = “散步”}
}
string connStr = GetConnectionString(); // 自行定义
BulkInsert(connStr, “dbo.user”, users, 1000, 30);
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
7. 本站有不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
66源码网 » 在c#中 sqlserver大量插入数据解决方式
