使用Petapoco批量插入/更新

sil*_*lba 19 petapoco

我正在使用该Save()方法来插入或更新记录,但我想让它只执行一次数据库命令来执行批量插入和批量更新.我该怎么做呢?

tay*_*onr 13

就我而言,我利用了这个database.Execute()方法.

我创建了一个SQL参数,其中包含插入的第一部分:

var sql = new Sql("insert into myTable(Name, Age, Gender) values");

for (int i = 0; i < pocos.Count ; ++i)
{
   var p = pocos[i];
   sql.Append("(@0, @1, @2)", p.Name, p.Age , p.Gender);
   if(i != pocos.Count -1)
     sql.Append(",");
}

Database.Execute(sql);
Run Code Online (Sandbox Code Playgroud)

  • 如果列表中有很多项目,它会在PetaPoco"Sql.Append()"方法中生成StackOverflow. (2认同)

joe*_*iks 12

我尝试了两种不同的方法来插入大量的行,比默认的Insert更快(当你有很多行时这很慢).

1)首先使用poco构建List <T>,然后在循环中(以及在事务中)立即插入它们:

using (var tr = PetaPocoDb.GetTransaction())
{
    foreach (var record in listOfRecords)
    {
        PetaPocoDb.Insert(record);
    }
    tr.Complete();
}
Run Code Online (Sandbox Code Playgroud)

2)SqlBulkCopy一个DataTable:

var bulkCopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.TableLock);
bulkCopy.DestinationTableName = "SomeTable";
bulkCopy.WriteToServer(dt);
Run Code Online (Sandbox Code Playgroud)

要将我的List <T>添加到DataTable,我使用Marc Gravells 将通用List/Enumerable转换为DataTable? 为我工作ootb的函数(在我将Poco属性重新排列为与db中的表字段完全相同的顺序之后).

SqlBulkCopy是最快的,比我用~1000行做的(快速)perf测试中的事务方法快50%左右.

心连心


Zel*_*lid 8

在一个SQL查询中插入要快得多.

以下是PetaPoco.Database类的客户方法,它增加了对任何集合进行批量插入的功能:

public void BulkInsertRecords<T>(IEnumerable<T> collection)
        {
            try
            {
                OpenSharedConnection();
                using (var cmd = CreateCommand(_sharedConnection, ""))
                {
                    var pd = Database.PocoData.ForType(typeof(T));
                    var tableName = EscapeTableName(pd.TableInfo.TableName);
                    string cols = string.Join(", ", (from c in pd.QueryColumns select tableName + "." + EscapeSqlIdentifier(c)).ToArray());
                    var pocoValues = new List<string>();
                    var index = 0;
                    foreach (var poco in collection)
                    {
                        var values = new List<string>();
                        foreach (var i in pd.Columns)
                        {
                            values.Add(string.Format("{0}{1}", _paramPrefix, index++));
                            AddParam(cmd, i.Value.GetValue(poco), _paramPrefix);
                        }
                        pocoValues.Add("(" + string.Join(",", values.ToArray()) + ")");
                    }
                    var sql = string.Format("INSERT INTO {0} ({1}) VALUES {2}", tableName, cols, string.Join(", ", pocoValues));
                    cmd.CommandText = sql;
                    cmd.ExecuteNonQuery();
                }
            }
            finally
            {
                CloseSharedConnection();
            }
        }
Run Code Online (Sandbox Code Playgroud)


Sch*_*ime -10

您只需对记录进行 foreach 即可。

foreach (var record in records) {
    db.Save(record);
}
Run Code Online (Sandbox Code Playgroud)