`

用微软提供的批量把数据导入到数据库方法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
分享到:
评论

相关推荐

    C#将数据导入excel和Excel数据导入数据库

    本主题聚焦于如何利用C#处理Excel文件,并将其数据导入到SQL Server数据库中。这一过程通常涉及到两个主要步骤:读取Excel数据和与数据库进行交互。 首先,我们来看C#读取Excel数据的部分。在.NET框架中,可以使用...

    c#实现excel数据高效导入到sql数据库

    本主题聚焦于使用C#编程语言实现Excel数据的高效导入到SQL数据库的过程,这在数据库管理、数据分析以及报表生成等场景下非常实用。下面我们将详细探讨这个过程涉及的关键知识点。 首先,要实现这一功能,我们需要对...

    批量插入数据库方法

    批量插入数据库的方法可以显著提高数据导入的效率,避免了单条插入时的频繁交互,减少了网络延迟和数据库事务开销。在C#中,我们可以利用ADO.NET或Entity Framework等库来实现这一功能。 1. **ADO.NET批量插入**: ...

    Excel导入导出,把数据从Excel直接导入到Sql数据库中

    "Excel导入导出"是数据操作中的常见操作,尤其是当需要处理大量数据,或者从Excel表格转换到结构化的数据库系统时。本篇文章将深入探讨如何将数据从Excel文件导入到Sql Server数据库中。 首先,我们需要理解Excel和...

    WInform 程序 将Excel导入SQLSERVER数据库

    总结来说,使用WInform程序将Excel导入SQL Server数据库涉及多个步骤,包括设计用户界面、读取Excel、建立数据库连接、数据转换、批量插入和异常处理。这个过程需要对.NET编程、Excel操作以及SQL Server管理有深入的...

    C#写的将csv文件导入至sql数据库,带存储过程的实例

    7. **执行数据导入**:调用SqlBulkCopy的WriteToServer方法,开始将数据导入数据库。 8. **关闭连接**:操作完成后,记得关闭数据库连接以释放资源。 在存储过程中,可以使用T-SQL语句批量插入数据,比如`INSERT ...

    从客户端导入Excel到SQL数据库 C#源码下载

    标题 "从客户端导入Excel到SQL数据库 C#源码下载" 提供了主要的知识点,即使用C#编程语言实现从Excel文件中读取数据并将其导入到SQL Server数据库的功能。这个过程通常涉及到文件I/O操作、数据处理以及数据库交互。 ...

    excel导入数据库

    总的来说,通过C#实现Excel导入数据库的功能,涉及到的关键技术包括:Excel文件的读取(如EPPlus库的使用)、数据库连接(ADO.NET)、数据转换(DataTable)以及数据批量导入(SqlBulkCopy)。这一过程既需要对C#...

    把Excle表格导入sql数据库中

    在IT行业中,将Excel表格数据导入SQL数据库是一项常见的任务,特别是在数据分析、报表生成或系统集成等领域。本项目涉及使用C#编程语言编写一个窗体应用程序,实现从Excel表格批量更新到SQL数据库的功能。以下是关于...

    C#winform实现Excel导入数据库,winform导出excel数据,C#

    接下来,要将读取的数据导入数据库,你需要使用ADO.NET,它是.NET Framework中的数据库访问技术。创建数据库连接,使用SqlCommand执行INSERT语句,或者使用SqlBulkCopy类批量插入数据。例如: ```csharp using ...

    VB txt文件导入access及MSSQL数据库实例

    - 对于大量数据,考虑使用`SqlBulkCopy`类,它可以高效地批量导入数据。 3. **处理单个TXT文件**: - 单个TXT文件的处理相对简单,直接读取并导入即可。 - 通常,VB程序会打开文件,读取每一行,然后将数据转化...

    asp.net Excel导入SQLserver源码

    在这个特定的项目中,"asp.net Excel导入SQLserver源码" 提供了一个功能,即从Excel文件批量导入数据到SQL Server 2000数据库中。这是一个常见的需求,特别是在数据迁移、数据处理或数据分析场景中。 在BS(Browser...

    SQLServer2000数据库与Excel数据表转换C#实现

    可以使用OpenXML SDK或者Microsoft.Office.Interop.Excel来读取Excel文件,然后创建SqlDataAdapter和DataSet,通过DataTable对象将数据加载到DataSet,最后使用SqlBulkCopy类批量插入到SQL Server数据库中。...

    C#+EXCEL导入数据库SQLserver 2005

    标题 "C#+EXCEL导入数据库SQLserver 2005" 涉及的主要知识点是使用C#编程语言与Microsoft SQL Server 2005数据库进行交互,特别是将Excel文件中的数据导入到SQL Server数据库中。这个过程通常涉及到以下几个关键步骤...

    asp.net(c#)excel数据导入Sql2005

    - 编写SQL命令(INSERT语句)来插入数据,或者使用`SqlBulkCopy`类进行批量导入,后者在大量数据导入时更有效率。 例如: ```csharp using (SqlConnection connection = new SqlConnection(connectionString)) { ...

    asp.net处理导入excel表到sql数据库

    在ASP.NET中,处理Excel文件导入到SQL数据库是一项常见的任务,尤其在数据处理、数据分析或者系统集成场景下。本文将详细讲解如何实现这个过程,包括支持.xlsx和.xls这两种不同的Excel文件格式。 首先,我们需要...

    XML与数据库相互转换

    例如,可以使用`XmlReader`配合`SqlBulkCopy`进行批量导入,或者使用`DataTable`和`DataSet`将XML数据映射到表格结构,再进行数据库操作。 2. **数据库到XML的导出**: 反向操作是将数据库中的数据导出为XML格式。...

    asp.net 导入excel

    在ASP.NET中,处理Excel文件是常见的需求之一,特别是当你需要从用户上传的Excel文件中批量导入数据到数据库时。这个场景在企业级应用中非常普遍,例如员工信息管理、订单处理、库存控制等。本文将详细介绍如何在ASP...

    Asp.net中Excel导入

    在Asp.net开发环境中,Excel数据的导入是一项常见的任务,特别是在需要从电子表格批量导入数据到数据库时。这里我们将深入探讨如何在Asp.net中实现Excel数据的导入,并将其存储到SQL Server 2005数据库中。 首先,...

    BatchInsertAndUpdate Test

    SqlBulkCopy类提供了批量插入功能,其速度远超常规的逐行插入,特别适合于大数据量的导入操作。使用时,你需要创建SqlBulkCopy实例,设置目标表名、列映射等属性,然后调用WriteToServer方法将数据写入数据库。 2. ...

Global site tag (gtag.js) - Google Analytics