//参数dt,数据源datatable
//参数tableName,目标sqlserver数据表名称
public void ExecuteTransactionScopeInsert(DataTable dt, string tableName)
{
int count = dt.Rows.Count;
int copyTimeout = 600;
bool flag = false;
try
{
using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString))
{
using (TransactionScope scope = new TransactionScope())
{
cn.Open();
using (SqlBulkCopy sbc = new SqlBulkCopy(cn))
{
//服务器上目标表的名称
sbc.DestinationTableName = tableName;
sbc.BatchSize = dt.Rows.Count;
sbc.BulkCopyTimeout = copyTimeout;
for (int i = 0; i < dt.Columns.Count; i++)
{
//列映射定义数据源中的列和目标表中的列之间的关系
sbc.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
}
sbc.WriteToServer(dt);
flag = true;
scope.Complete();//有效的事务
}
}
}
}
catch (Exception ex)
{
throw ex;
}
}
#endregion
#region 初始化datatable,以便其结构与sqlserver数据表结构相同,这个初始化函数根据每个数据表的不同需要重写,没什么通用性
public DataTable GetTableSchema()
{
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[]{
new DataColumn("oldid",typeof(int)),
new DataColumn("db",typeof(string))});
return dt;
}
#endregion
protected void Page_Load(object sender, EventArgs e)
{
string ids = Request.Params["ids"] == null ? "" : Request.Params["ids"].ToString();//id的集合,id之间用逗号分隔,如“1,2,3,4”
string db = Request.Params["db"] == null ? "" : Request.Params["db"].ToString();//目标sqlserver数据表的名称
if (ids != "" & db != "")
{
string[] sArray = ids.Split(',');
DataTable dt = GetTableSchema(); //初始化datatable
//遍历id集合,将每个id作为一条记录添加到datatable
foreach (string i in sArray)
{
DataRow r = dt.NewRow();
r[0] = i.ToString();
r[1] = db;
dt.Rows.Add(r);
}
ExecuteTransactionScopeInsert(dt, "sqlServerTableName");//将datatable导入到sql server
}
}

该博客介绍了如何在ASP.NET环境中使用SqlBulkCopy类将接收到的逗号分隔的ID集合转换为DataTable,并进一步批量导入到指定的SQL Server表中。通过Request.Params获取参数ids和db,将ids拆分为数组,然后创建DataTable并填充数据,最后调用ExecuteTransactionScopeInsert方法执行批量导入操作。
369

被折叠的 条评论
为什么被折叠?



