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)
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%左右.
心连心
在一个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)
| 归档时间: |
|
| 查看次数: |
18145 次 |
| 最近记录: |