从 .NET 4.0 应用程序将多行插入 SQL Server 2008 数据库的最佳方法

发布于 2024-12-26 13:27:19 字数 185 浏览 1 评论 0原文

我有一个场景,我取回一个项目列表,我需要将每个项目插入数据库,其中一个项目 > >一行映射。

最初,我考虑使用一个存储过程来插入单个项目,然后循环遍历列表,为每个元素调用存储过程。但我想知道是否有更优雅/最佳的方法可用。特别是利用 SQL Server 2008 / .NET 4.0。

实体框架也可以发挥作用。

I have a scenario where I get back a list of items and I need to insert each item into a database, with one item > one row mapping.

Initially, I thought about using a stored procedure that would insert a single item, and looping over a list, calling the stored procedure for each element. But I wonder if there are more elegant/optimal methods available. Especially leveraging SQL Server 2008 / .NET 4.0.

Entity Framework could also come into play.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

夏尔 2025-01-02 13:27:20

SQLBulkCopy 快速而简单,您可以设置批量大小并映射所有列

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx

SQLBulkCopy is quick and easy, you can set up a batch size and map all of your columns

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx

红焚 2025-01-02 13:27:20

有几种方法可以进行批量插入。

  1. 使用SqlDataAdapter,在其上设置InsertCommand,然后使用例如DataTable(MSDN)。这可以将插入件分批成您选择的批量大小。
  2. 使用 SqlBulkCopy 类(使用该类可以获得更好的性能)。
  3. 创建一个采用 TABLE 值参数的存储过程 - 然后传递一个数据表以供该存储过程一次性插入(MSDN)

我之前曾在博客中介绍过选项 1 与选项 2 的性能此处

There's a few ways you can do bulk inserts.

  1. Use a SqlDataAdapter, set the InsertCommand on it, and call .Update with e.g. a DataTable (MSDN). This can batch up the inserts into batch sizes of your choosing.
  2. Use SqlBulkCopy class (better performance possible with this).
  3. Create a sproc that takes a TABLE valued parameter - then pass a table of data in for that sproc to insert in one go (MSDN)

I've previously blogged about the performance of option 1 vs. option 2 here.

如梦 2025-01-02 13:27:20

在实体框架中,您可以执行以下操作:

yourContext.Configuration.AutoDetectChangesEnabled = false;
yourContext.Configuration.ValidateOnSaveEnabled = false;

在包含 100 个插入的包中执行 SaveChanges()...尝试使用 1000 个插入并查看更改。

由于在所有这些插入期间,上下文都是相同的,因此您可以每 1000 次插入重建上下文对象。

 var yourContext = new YourContext();

在我的导入数据过程中进行此改进,将时间从 7 分钟缩短到 6 秒。

实际数字...在你的情况下不可能是 100 或 1000...尝试并调整它。

In Entity Framework you could do:

yourContext.Configuration.AutoDetectChangesEnabled = false;
yourContext.Configuration.ValidateOnSaveEnabled = false;

Do SaveChanges() in packages of 100 inserts... try with 1000 and see the changes.

Since during all this inserts, the context is the same, you can rebuild your context object every 1000 inserts.

 var yourContext = new YourContext();

Doing this improvements in an importing data process of mine, took it from 7 minutes to 6 seconds.

The actual numbers... could not be 100's o 1000's in your case... try it and tweek it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文