【问题标题】:passing parameter of list of values and tables to stored procedure将值和表列表的参数传递给存储过程
【发布时间】:2014-05-28 12:35:34
【问题描述】:

我的目的是实现一个 C# 应用程序,该应用程序需要使用现有的存储过程,该过程接收参数中的 ID 或值。 我负责的任务分为两个步骤:

1- 迁移存储过程以接收 IDs(int) 列表和当前参数列表,意味着像一个表

2- 实现调用这个程序的层,并将接收 List 和 KeyValuePair 或 KeyValuePair

最好的方法是什么?

EntityFramework 包装 SP 还是不包装 ORM? 如何在 SP 端实现 List 和 KeyValuePair 参数?使用表值参数?

我使用的是 SQL 2012

谢谢,

【问题讨论】:

  • 表值参数对我来说看起来不错。 See second answer。此外,您不应该问What's the best approach 类型的问题。这是题外话,因为你在征求意见。
  • IMO,最好的方法是this投票最多的答案。
  • 抱歉请教最佳方法。在我看来,XML 参数是要避免的(如重复帖子中所述)。不喜欢 c# 中的额外层来处理这个问题。似乎TVP是要走的路??

标签: c# sql sql-server stored-procedures


【解决方案1】:

在 sql 端尝试用户定义的表类型功能,并在存储过程中将表作为参数传递。

例如:

CREATE TABLE Test
(
Id int NOT NULL IDENTITY (1, 1),
TestName varchar(50) NOT NULL,
Value int NULL
) ON [PRIMARY]

-- Create a table data type

CREATE TYPE [dbo].[TestType] As Table
(
--This type has structure similar to the DB table 
TestName varchar(50) NOT NULL,
Value int NULL
)

--This is the Stored Procedure

CREATE PROCEDURE [dbo].[TestProcedure]
(
    @Test As [dbo].[TestType] Readonly
)
AS
Begin
Insert Into Test(TestName,Value)
Select TestName, Value From @Test
End

传递数据的C#代码如下:

DataTable dataTable = new DataTable("SampleDataType");

// We create column names as per the type in DB 

dataTable.Columns.Add("TestName", typeof(string)); 
dataTable.Columns.Add("Value", typeof(Int32)); 

// And fill in some values 

dataTable.Rows.Add("Metal", 99); 
dataTable.Rows.Add("HG", null);
...
SqlParameter parameter = new SqlParameter(); 

// The parameter for the SP must be of SqlDbType.Structured 

parameter.ParameterName="@Test"; 
parameter.SqlDbType = System.Data.SqlDbType.Structured; 
parameter.Value = dataTable; 

command.Parameters.Add(parameter); 

【讨论】:

    【解决方案2】:

    我最近处理了同样的问题。上面 cmets 中的链接列出了如何使用表值参数执行 SP。我用过TVP方法,简单干净。

    对于实体框架,您可以让 EF 了解存储过程并调用它们并将结果返回到 EF 对象中。这是一个链接:

    http://msdn.microsoft.com/en-us/data/gg699321.aspx

    这比仅仅使用 ADO 调用 SP 要多得多。一个主要考虑因素是 SP 返回的结果是否直接映射到您的对象之一。假设您要在搜索中加入几个表。您必须为这些结果创建一个新模型并将 SP 映射到该模型,以及为什么呢?所以一切都会运行得更慢。

    如果您只是读取数据并且结果并未完全映射到现有模型,您应该跳过 EF 并直接使用 ADO。如果,OTOH,您正在执行读取和写入操作,并且您真的希望将所有内容都保存在 EF 中以保持一致性,这是可能的。

    【讨论】:

    • 谢谢,我最终使用了 ADO,我让我的 SP 使用 TVP 只是为了进行更新、计数或不返回数据的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多