SqlBulkCopy 批量增加到数据库

Microsoft SQL Server 提供一个称为 bcp 的流行的命令提示符实用工具,用于将数据从一个表移动到另一个表(表既可以在同一个服务器上,也可以在不同服务器上)。 SqlBulkCopy 类允许编写提供类似功能的托管代码解决方案。 还有其他将数据加载到 SQL Server 表的方法(例如 INSERT 语句),但相比之下 SqlBulkCopy 提供明显的性能优势。

 

使用 SqlBulkCopy 类只能向 SQL Server 表写入数据。 但是,数据源不限于 SQL Server;可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据。

 

当把 SqlDateTime 类型的 DataTable 列批量加载到类型为 SQL Server 2008 中新增的日期/时间类型的 SQL Server 列时,SqlBulkCopy 将失败。

 

 

public static VendorItemLastCostList BatchAddVendorItemLastCost(VendorItemLastCostList request)

        {

            if (request != null && request.VendorItemLastCostLists != null)

            {

                DateTime dt = DateTime.Now;

 

                DataTable table = new DataTable();

         

                table.TableName = "VendorItemLastCostForUpload";

 

               // table.Columns.Add(new DataColumn("TransactionNumber", typeof(Int32)));

         

                table.Columns.Add(new DataColumn("VendorNumber", typeof(String)));

          

                table.Columns.Add(new DataColumn("ItemNumber", typeof(String)));

         

                table.Columns.Add(new DataColumn("CurrencyCode", typeof(String)));

        

                table.Columns.Add(new DataColumn("LastCost", typeof(Decimal)));

      

                table.Columns.Add(new DataColumn("InUser", typeof(String)));

        

                table.Columns.Add(new DataColumn("Indate", typeof(DateTime)));

 

          

               foreach (var item in request.VendorItemLastCostLists)

                  {

                      DataRow dr=  table.NewRow();

               

                      dr["VendorNumber"] = item.VendorNumber;

                      dr["ItemNumber"] = item.ItemNumber;

                      dr["CurrencyCode"] = item.CurrencyCode;

                      dr["LastCost"] = item.LastCost;

                      dr["InUser"] = item.LoginName;

                      dr["Indate"] = dt.ToString("yyyy-MM-dd HH:mm:ss") ;

                      table.Rows.Add(dr);

                 }

          

                string conn = @"";

                //使用SqlBulkCopyOptions.UseInternalTransaction是指迁移动作指定在一个Transaction当中,如果数据迁移中产生错误或异常将发生回滚。

                using (SqlBulkCopy bcp=new SqlBulkCopy(conn,SqlBulkCopyOptions.UseInternalTransaction))

                {

                    try

                    {

                        //DB TableName

                        bcp.DestinationTableName = "VendorItemLastCostForUpload";

                        bcp.BulkCopyTimeout = 120;

                        //Memeory DataTable ColumnName mapping DB table column name

                        bcp.ColumnMappings.Add("VendorNumber", "VendorNumber");

                        bcp.ColumnMappings.Add("ItemNumber", "ItemNumber");

                        bcp.ColumnMappings.Add("CurrencyCode", "CurrencyCode");

                        bcp.ColumnMappings.Add("LastCost", "LastCost");

                        bcp.ColumnMappings.Add("InUser", "InUser");

                        bcp.ColumnMappings.Add("Indate", "Indate");

                        bcp.WriteToServer(table);

                        bcp.Close();

                        request.IsSuccess = true;

                    }

                    catch (Exception ex)

                    {

                        Logger.WriteErrorLog(ex.Message);

                    }

                    finally

                    {

                        request.InDate = dt.ToString("yyyy-MM-dd HH:mm:ss");

                    }

                }

            }

            return request;

        }

 

 

 

posted on 2013-05-15 09:33  sajiao  阅读(349)  评论(2编辑  收藏  举报

导航

街边网