【问题标题】:Best Way to Insert Multiple Rows (ADO.NET)插入多行的最佳方法 (ADO.NET)
【发布时间】:2010-12-28 04:33:39
【问题描述】:

我正在向现有的 ASP.NET 项目添加功能。该代码调用存储过程以将行添加到特定表。我还需要允许其中一列具有多个值的选项,在这种情况下,将为该列中的每个值添加一行。

我知道我可以为每一行调用一次插入方法,但这听起来非常低效。我知道我可以写多行,用分号分隔,然后在一个请求中将它们发送到数据库。但是现有代码调用了一个存储过程,因此需要我修改多个插入语句。

请注意,多个值将作为多行存储在文本框中,每个值一行,并且必须明显检查是否正确输入。

有没有更简单的方法来解决这个问题?

【问题讨论】:

  • +1 - 我也对这个问题的答案感兴趣
  • 请问什么版本的 SQL Server?从 2000 年到 2005 年到 2008 年,答案可能会有所不同......
  • 我不是 100% 清楚他们将在服务器上使用什么。所以我可能不想针对 2005 年之后的任何具体内容。
  • ADO.Net DataTable 怎么样?我不确定代码是如何生成的。

标签: asp.net sql-server ado.net


【解决方案1】:

SQL Server 2008 具有允许多行作为参数的“表类型”参数。一个例子定义在this SO question

SQL Server 2005+ 具有良好的 XML 处理能力。我们目前将其用于小型数据集。 SQL Server 2000 XML 处理没有那么好。

对于所有版本,您可以创建一个临时表,然后调用使用该表的存储过程。您可以使用 SQLBulkCopy 加载表。对多行有用。

一般来说,这个问题很常见。 Erland Sommarskog 有一篇文章“Arrays and Lists in SQL Server 2005 and Beyond”,这是关于该主题的权威文章(其中一篇)(他有更多文章)。

总结:

  • 表类型(SQL Server 2008+)
  • XML(使用 SQL Server 2005+ 更容易)
  • 临时表(所有版本)

【讨论】:

  • 有趣。可能比我现在想跳的要多一点。
【解决方案2】:

这样的事情怎么样:

INSERT INTO MyTable (FirstCol, SecondCol)
SELECT 'First' ,1
UNION ALL
SELECT 'Second' ,2
UNION ALL
SELECT 'Third' ,3
UNION ALL
SELECT 'Fourth' ,4
UNION ALL
SELECT 'Fifth' ,5

here窃取。

如果您使用的是 SQL Server 2008,则可以使用此方法:

INSERT INTO MyTable (FirstCol, SecondCol)
VALUES('First' ,1)
VALUES('Second' ,2)
VALUES('Third' ,3)
VALUES('Fourth' ,4)

不知道如何通过...使用存储过程来使用它。

【讨论】:

  • 谢谢,但我不认为这与存储过程兼容。上面的代码预先知道要插入多少个值,因此需要在客户端执行。
  • 我不认为你可以用存储过程做你想做的事,除非你一遍又一遍地做EXEC sp_MyProc。如果您使用循环来创建将要执行的 SQL 语句,则无需知道使用上述方法将执行的插入次数。如果您确实使用循环来创建 SQL 语句,请非常小心,不要让自己对 SQL 注入开放。
【解决方案3】:

我最终发送了一个分隔字符串作为存储过程参数之一,然后从字符串中解析出每个元素并为每个元素添加一行。

我不确定这是完成此任务的最佳方式,但它不需要大量修改现有代码,而且对我来说似乎应该相当有效。

【讨论】:

  • 这个其实在我的文章链接里有描述
  • 其中至少有一篇文章非常长。您能否更具体地了解哪个链接?谢谢。
  • “SQL Server 2005 及更高版本中的数组和列表”。它很长,因为它是一个复杂的主题
【解决方案4】:

查看 SqlBulkCopy,它将允许您将 Datatable 直接传递到数据库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-30
    • 2010-09-07
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    相关资源
    最近更新 更多