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

时间:2014-05-28 12:35:34

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

我正在实现一个C#应用程序,它需要使用现有的存储过程来接收params中的ID或值。 我的任务分为两步:

1-迁移存储过程以便接收ID列表(int)和当前参数列表,就像表格一样

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

这样做的最佳方法是什么?

EntityFramework包装SP或不包含ORM? 如何实现List和KeyValuePair params ob SP方面?有表值的参数?

我正在使用SQL 2012

感谢,

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

我刚才处理过同样的问题。上面评论中的链接规定了如何使用表值参数执行SP。我使用了TVP方法,它简单易用。

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

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

与仅使用ADO调用SP相比,它的工作要多得多。一个主要的考虑因素是SP映射返回的结果是否直接映射到您的一个对象上。假设您在搜索中加入了几个表。您必须为这些结果制作新模型并将SP映射到该模型以及用于什么?所以一切都会变慢。

如果您只是在阅读数据并且结果并未完全映射到现有模型,则应跳过EF并直接使用ADO。如果,OTOH,你正在进行读写操作,并且为了一致性,你真的想保留EF中的所有内容,这是可能的。