有没有更有效的方法在我的数据库中插入数据数组? Asp.net-核心+Dapper
Is there a more efficient way to insert an array of data inside my database? Asp.net-core + Dapper
有什么方法可以提高效率吗?当我插入一个包含 50 多个项目的数组时花费的时间太长。
我的 API 控制器调用了该方法。
提前致谢,我对这些东西还是新手。
DataAccess data = new DataAccess();
[HttpPost]
public void Post(Contract[] contractList)
{
data.insertContracts(contractList);
}
public class DataAccess
{
public void insertList(Contract[] contractList)
{
using (IDbConnection connection = new SqlConnection(connectString))
{
foreach (var item in contractList)
{
Execute("dbo.spInsertContract @contract_Id, @color, @contract_Type, @ne_Type, @storn, @dispo_Id, @kw, @create_Date, @termin_Date", item);
}
}
}
}
此代码运行良好,其性能与常规方法相当。所以它不是真正插入大量数据的方法。一个理想的方法是使用 SQL Bulk Copy 而忘记 Dapper。
public async Task InsertList(Contract[] contractList)
{
using (var connection = new SqlConnection("ConnectionString"))
{
var parameters = contractList.Select(u =>
{
var tempParams = new DynamicParameters();
tempParams.Add("@contract_Id", u, DbType.Int32, ParameterDirection.Input);
tempParams.Add("@color", u, DbType.String, ParameterDirection.Input);
tempParams.Add(" @contract_Type", u, DbType.String, ParameterDirection.Input);
...
return tempParams;
});
await connection.ExecuteAsync("INSERT INTO [Contract] (contract_Id, color, contract_Type, ...) VALUES ( @contract_Id, @color, @contract_Type,...)",
parameters).ConfigureAwait(false);
}
}
有什么方法可以提高效率吗?当我插入一个包含 50 多个项目的数组时花费的时间太长。
我的 API 控制器调用了该方法。
提前致谢,我对这些东西还是新手。
DataAccess data = new DataAccess();
[HttpPost]
public void Post(Contract[] contractList)
{
data.insertContracts(contractList);
}
public class DataAccess
{
public void insertList(Contract[] contractList)
{
using (IDbConnection connection = new SqlConnection(connectString))
{
foreach (var item in contractList)
{
Execute("dbo.spInsertContract @contract_Id, @color, @contract_Type, @ne_Type, @storn, @dispo_Id, @kw, @create_Date, @termin_Date", item);
}
}
}
}
此代码运行良好,其性能与常规方法相当。所以它不是真正插入大量数据的方法。一个理想的方法是使用 SQL Bulk Copy 而忘记 Dapper。
public async Task InsertList(Contract[] contractList)
{
using (var connection = new SqlConnection("ConnectionString"))
{
var parameters = contractList.Select(u =>
{
var tempParams = new DynamicParameters();
tempParams.Add("@contract_Id", u, DbType.Int32, ParameterDirection.Input);
tempParams.Add("@color", u, DbType.String, ParameterDirection.Input);
tempParams.Add(" @contract_Type", u, DbType.String, ParameterDirection.Input);
...
return tempParams;
});
await connection.ExecuteAsync("INSERT INTO [Contract] (contract_Id, color, contract_Type, ...) VALUES ( @contract_Id, @color, @contract_Type,...)",
parameters).ConfigureAwait(false);
}
}