转载

用微软提供的批量把数据导入到数据库方法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);        }        }     } 
正文到此结束
Loading...