平时老是碰到把一批数据插入到数据库。通常的办法是循环一条条插进去,也挺好的挺省事,但是如果数据超过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); } } }