将值和表列表的参数传递给存储过程

本文关键字:参数传递 存储过程 列表 | 更新日期: 2023-09-27 18:05:27

我即将实现一个c#应用程序,该应用程序需要使用已经存在的存储过程,该存储过程接收参数中的id或值。我负责的任务分为两步:

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

2-实现调用此过程的层,并将接收List和KeyValuePair或KeyValuePair

最好的方法是什么?

实体框架包装sp或不是ORM ?如何实现列表和KeyValuePair参数的SP方?

我正在使用SQL 2012

谢谢,

将值和表列表的参数传递给存储过程

尝试在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); 

我最近刚刚处理过同样的问题。上面评论中的链接展示了如何使用表值参数执行sp。我用过TVP方法,它既简单又干净。

当涉及到实体框架时,您可以使EF意识到存储过程并调用它们并将结果返回到EF对象中。这里有一个链接:

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

这比仅仅用ADO调用sp要做更多的工作。一个主要的考虑是SP返回的结果是否直接映射到您的一个对象上。假设您要在搜索中连接两个表。你必须为这些结果建立一个新模型并将SP映射到那个模型上,这是为了什么?所以一切都会变慢。

如果你只是读取数据,结果不完全映射到一个现有的模型,你应该跳过EF,直接使用ADO。如果,OTOH,你正在做读和写,你真的想保持所有的EF一致性,这是可能的。