zoukankan      html  css  js  c++  java
  • PetaPoco 批量插入数据

    网上找的代码,还没经过验证

    /// <summary>
        /// Bulk inserts multiple rows to SQL
        /// </summary>
        /// <param name="tableName">The name of the table to insert into</param>
        /// <param name="primaryKeyName">The name of the primary key column of the table</param>
        /// <param name="autoIncrement">True if the primary key is automatically allocated by the DB</param>
        /// <param name="pocos">The POCO objects that specifies the column values to be inserted</param>
        /// <param name="batchSize">The number of POCOS to be grouped together for each database rounddtrip</param>        
        public void BulkInsert(string tableName, string primaryKeyName, bool autoIncrement, IEnumerable<object> pocos, int batchSize = 25)
        {
            try
            {
                OpenSharedConnection();
                try
                {
                    using (var cmd = CreateCommand(_sharedConnection, ""))
                    {
                        var pd = PocoData.ForObject(pocos.First(), primaryKeyName);
                        // Create list of columnnames only once
                        var names = new List<string>();
                        foreach (var i in pd.Columns)
                        {
                            // Don't insert result columns
                            if (i.Value.ResultColumn)
                                continue;
    
                            // Don't insert the primary key (except under oracle where we need bring in the next sequence value)
                            if (autoIncrement && primaryKeyName != null && string.Compare(i.Key, primaryKeyName, true) == 0)
                            {
                                // Setup auto increment expression
                                string autoIncExpression = _dbType.GetAutoIncrementExpression(pd.TableInfo);
                                if (autoIncExpression != null)
                                {
                                    names.Add(i.Key);
                                }
                                continue;
                            }
                            names.Add(_dbType.EscapeSqlIdentifier(i.Key));
                        }
                        var namesArray = names.ToArray();
    
                        var values = new List<string>();
                        int count = 0;
                        do
                        {
                            cmd.CommandText = "";
                            cmd.Parameters.Clear();
                            var index = 0;
                            foreach (var poco in pocos.Skip(count).Take(batchSize))
                            {
                                values.Clear();
                                foreach (var i in pd.Columns)
                                {
                                    // Don't insert result columns
                                    if (i.Value.ResultColumn) continue;
    
                                    // Don't insert the primary key (except under oracle where we need bring in the next sequence value)
                                    if (autoIncrement && primaryKeyName != null && string.Compare(i.Key, primaryKeyName, true) == 0)
                                    {
                                        // Setup auto increment expression
                                        string autoIncExpression = _dbType.GetAutoIncrementExpression(pd.TableInfo);
                                        if (autoIncExpression != null)
                                        {
                                            values.Add(autoIncExpression);
                                        }
                                        continue;
                                    }
    
                                    values.Add(string.Format("{0}{1}", _paramPrefix, index++));
                                    AddParam(cmd, i.Value.GetValue(poco), i.Value.PropertyInfo);
                                }
    
                                string outputClause = String.Empty;
                                if (autoIncrement)
                                {
                                    outputClause = _dbType.GetInsertOutputClause(primaryKeyName);
                                }
    
                                cmd.CommandText += string.Format("INSERT INTO {0} ({1}){2} VALUES ({3})", _dbType.EscapeTableName(tableName),
                                                                 string.Join(",", namesArray), outputClause, string.Join(",", values.ToArray()));
                            }
                            // Are we done?
                            if (cmd.CommandText == "") break;
                            count += batchSize;
                            DoPreExecute(cmd);
                            cmd.ExecuteNonQuery();
                            OnExecutedCommand(cmd);
                        }
                        while (true);
    
                    }
                }
                finally
                {
                    CloseSharedConnection();
                }
            }
            catch (Exception x)
            {
                if (OnException(x))
                    throw;
            }
        }
    
    
        /// <summary>
        /// Performs a SQL Bulk Insert
        /// </summary>
        /// <param name="pocos">The POCO objects that specifies the column values to be inserted</param>        
        /// <param name="batchSize">The number of POCOS to be grouped together for each database rounddtrip</param>        
        public void BulkInsert(IEnumerable<object> pocos, int batchSize = 25)
        {
            if (!pocos.Any()) return;
            var pd = PocoData.ForType(pocos.First().GetType());
            BulkInsert(pd.TableInfo.TableName, pd.TableInfo.PrimaryKey, pd.TableInfo.AutoIncrement, pocos);
        }

    摘自:http://stackoverflow.com/questions/6595105/bulk-insert-update-with-petapoco/14479073

  • 相关阅读:
    [LeetCode每日1题][简单] 169. 多数元素
    [LeetCode每日1题][简单] 1013. 将数组分成和相等的三个部分
    [LeetCode每日1题][中等] 322. 零钱兑换
    [LeetCode每日1题][中等] 面试题59
    软工实践个人总结
    2019 SDN大作业
    2019 SDN上机第7次作业
    第01组 Beta版本演示
    如果有一天我变得很有钱组——alpha冲刺day7
    如果有一天我变得很有钱组——alpha冲刺day6
  • 原文地址:https://www.cnblogs.com/haight/p/5208682.html
Copyright © 2011-2022 走看看