欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用微软提供的批量把数据导入到数据库方法SqlBulkCopy真是好用好快 博客分类: mmsql数据,mysqlasp.net开发 SqlBulkCopyc# 

程序员文章站 2024-03-21 21:56:46
...
平时老是碰到把一批数据插入到数据库。通常的办法是循环一条条插进去,也挺好的挺省事,但是如果数据超过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);
                            }  
相关标签: SqlBulkCopy c#