用微软提供的批量把数据导入到数据库方法SqlBulkCopy真是好用好快

平时老是碰到把一批数据插入到数据库。通常的办法是循环一条条插进去,也挺好的挺省事,但是如果数据超过1000以上,真是慢啊,而且占资源,好在微软都替我们想好了,用SqlBulkCopy这个方法很方便,纷纷秒就被上万数据导进去了;
具体作法分享如下:
1.建一个表DataTable把数据首先插到表里

DataTable dt = new DataTable();
dt.Columns.Add("HTH");//合同号
dt.Columns.Add("HTMC");//合同名称
dt.Columns.Add("HKYF");//回款月份
dt.Columns.Add("JF");//甲方
dt.Columns.Add("JFMS");//甲方描述
dt.Columns.Add("QDRQ");//签订日期
dt.Columns.Add("QDRBM");//签订人编码
dt.Columns.Add("QDR");//签订人

dt.Columns.Add("HKZRRBM");//回款责任人编码
dt.Columns.Add("HKZRRMS");//回款责任人描述

dt.Columns.Add("HKZRRBMBM");//回款责任人描述
dt.Columns.Add("HKZRRBMMS");//回款责任人部门描述

dt.Columns.Add("HTE");//合同额
dt.Columns.Add("BB");//币别
dt.Columns.Add("YSK");//已收款
dt.Columns.Add("WSK");//未收款
dt.Columns.Add("WDZ");//未达账
dt.Columns.Add("GS");//公司
if (table.Count > 0)
{
for (int i = 0; i < table.Count; i++)
{
table.CurrentIndex = i;
DataRow dr = dt.NewRow();
dr["HTH"] = table.GetString("BSTNK") ?? ""; //合同号
dr["HTMC"] = table.GetString("ZSD019") ?? ""; //合同名称
dr["HKYF"] = strHKYF;
dr["JF"] = table.GetString("KUNNR") ?? "";//甲方
dr["JFMS"] = table.GetString("ZKHMC") ?? "";//甲方描述
dr["QDRQ"] = Convert.ToDateTime(table.GetString("BSTDK")); //签订日期
if (Convert.ToDateTime(table.GetString("BSTDK"))<Convert.ToDateTime("1900-01-01"))
{
dr["QDRQ"] =Convert.ToDateTime("1900-01-01");
}
dr["QDRBM"] = table.GetString("ZQDR") ?? "";//签订人编码
dr["QDR"] = table.GetString("ZQDRM") ?? "";//签订人
//dr["HTE"] = table.GetString("ZHTJE");//合同金额
dr["HKZRRBM"] = table.GetString("ZHKR") ?? "";//回款责任人编码
dr["HKZRRMS"] = table.GetString("ZHKRM") ?? "";//回款责任人描述
dr["HKZRRBMBM"] = table.GetString("ZHKR") ?? "";//回款责任人部门 TODO:sap

dr["HKZRRBMMS"] = table.GetString("ZHKRM") ?? "";//回款责任人部门 描述TODO:sap

dr["HTE"] = table.GetDecimal("ZHTJE"); //合同额
dr["BB"] = table.GetString("WAERS") ?? ""; //币别
dr["YSK"] = table.GetString("ZYSK") ?? "";//已收款

dr["WSK"] = table.GetDecimal("ZWSK");//未收款
dr["WDZ"] = table.GetDecimal("ZWDZ");//未收款
dr["GS"] = table.GetString("VKORG");//公司 TODO:SAP销售组织
decimal deWsk=0;
decimal.TryParse(dr["WSK"].ToString(),out deWsk);
if(deWsk>0)
dt.Rows.Add(dr);
}
}
return dt;


2.第二步设置表的表的对应关系


using (SqlConnection con=new SqlConnection (strConn))
{
con.Open();
using (SqlTransaction tr = con.BeginTransaction())
{
cmdText = "DELETE FROM T_PC_PaymentCollection WHERE TypeSatus='同步' and PCMonth='" + strPCMonth + "'";


using (SqlCommand c = new SqlCommand(cmdText, con,tr))
{
c.ExecuteScalar();
iRCount++;
}

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(strConn))
{
// 列映射
bulkCopy.DestinationTableName = "T_PC_PaymentCollection";
bulkCopy.ColumnMappings.Add("HTH", "ContractNumber");//合同号
bulkCopy.ColumnMappings.Add("HTMC", "ContractName");//合同名称

bulkCopy.ColumnMappings.Add("HKYF", "PCMonth");//
//bulkCopy.ColumnMappings.Add("HTMC", "PCCompany");//公司TODO:等待SAP

bulkCopy.ColumnMappings.Add("JF", "FirstPartyID");//甲方
bulkCopy.ColumnMappings.Add("JFMS", "FirstParty");//甲方描述
bulkCopy.ColumnMappings.Add("QDRQ", "SignDate");//签订日期
bulkCopy.ColumnMappings.Add("QDRBM", "SignPersonID");//签订人编码
bulkCopy.ColumnMappings.Add("QDR", "SignPerson");//签订人

bulkCopy.ColumnMappings.Add("HKZRRBM", "ResponsiblePersonId");//回款责任人编码
bulkCopy.ColumnMappings.Add("HKZRRMS", "ResponsiblePersonName");//回款责任人描述

bulkCopy.ColumnMappings.Add("HKZRRBMMS", "PCDepartment");//回款责任人部门描述

bulkCopy.ColumnMappings.Add("HTE", "ContractMoney");//合同额
bulkCopy.ColumnMappings.Add("BB", "Currency");//币别
bulkCopy.ColumnMappings.Add("YSK", "ReceivedMoney");//已收款
bulkCopy.ColumnMappings.Add("WSK", "TransitAccount");//未收款

//bulkCopy.ColumnMappings.Add("WDZ", "NotComeAmount");//未达款
bulkCopy.ColumnMappings.Add("GS", "PCCompany");//

//int iActionStauts = 0;
try
{
bulkCopy.WriteToServer(dt);

iActionStauts = 1;
UpdateExeFlag(ir, iActionStauts);
tr.Commit();
}
catch (Exception)
{
iActionStauts = 0;
tr.Rollback();
UpdateExeFlag(ir, iActionStauts);
}

}
}

3.把数据导入数据
 try
{
bulkCopy.WriteToServer(dt);

iActionStauts = 1;
UpdateExeFlag(ir, iActionStauts);
tr.Commit();
}
catch (Exception)
{
iActionStauts = 0;
tr.Rollback();
UpdateExeFlag(ir, iActionStauts);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值