Exemplo n.º 1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public bool Update(DMSTransactionScopeBulkCopyEntity entity)
        {
            List <int> resultValueList = new List <int>();
            string     errMsg          = string.Empty;

            return(Update(entity, ref resultValueList, ref errMsg));
        }
Exemplo n.º 2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="resultValueList"></param>
        /// <param name="errMsg"></param>
        /// <returns></returns>
        public bool Update(DMSTransactionScopeBulkCopyEntity entity, ref List <int> resultValueList, ref string errMsg)
        {
            if (entity.InternalDbProvider == null)
            {
                errMsg = "请确保有一个表格指定了elementType类型来进行读取数据库配置";
                throw new DMSFrameException(errMsg);
            }
            resultValueList = new List <int>();
            Queue <TransactionScopeBulkCopyEntity> scopeEntityList = entity.GetEditTS();
            bool flag = true;

            if (scopeEntityList != null && scopeEntityList.Count > 0)
            {
                using (var conn = entity.InternalDbProvider.GetOpenConnection())
                {
                    IDbTransaction sqlbulkTransaction = conn.BeginTransaction(System.Data.IsolationLevel.ReadCommitted);
                    try
                    {
                        foreach (TransactionScopeBulkCopyEntity item in scopeEntityList)
                        {
                            #region sqlBulkCopy
                            SqlBulkCopy sqlBulkCopy = new SqlBulkCopy((SqlConnection)conn, SqlBulkCopyOptions.Default, (SqlTransaction)sqlbulkTransaction);
                            try
                            {
                                string tableName = item.TableName;
                                if (item.TableFunc != null)
                                {
                                    tableName = item.TableFunc.Compile()(tableName);
                                }
                                sqlBulkCopy.DestinationTableName = tableName;
                                sqlBulkCopy.BatchSize            = 20000; //20000行每连接
                                sqlBulkCopy.BulkCopyTimeout      = 50;    //50秒超时
                                if (item.ColumnMapping != null)
                                {
                                    foreach (var c in item.ColumnMapping)
                                    {
                                        sqlBulkCopy.ColumnMappings.Add(c.Key, c.Value);
                                    }
                                }
                                sqlBulkCopy.WriteToServer(item.DataTable);
                                resultValueList.Add(item.DataTable.Rows.Count);
                            }
                            catch (Exception ex)
                            {
                                flag   = false;
                                errMsg = ex.Message;
                                Log.Debug(ReflectionUtils.GetMethodBaseInfo(System.Reflection.MethodBase.GetCurrentMethod()), "执行批量插入数据库出错了", ex);
                                throw ex;
                            }
                            finally
                            {
                                sqlBulkCopy.Close();
                            }
                            #endregion
                        }
                        if (flag)
                        {
                            sqlbulkTransaction.Commit();
                        }
                        else
                        {
                            sqlbulkTransaction.Rollback();
                        }
                    }
                    catch (Exception ex)
                    {
                        sqlbulkTransaction.Rollback();
                        errMsg = ex.Message;
                        Log.Debug(ReflectionUtils.GetMethodBaseInfo(System.Reflection.MethodBase.GetCurrentMethod()), "执行批量插入数据库出错了", ex);
                        throw ex;
                    }
                    finally
                    {
                        entity.Clear();
                    }
                }
            }
            return(flag);
        }