我正在实现一个C#应用程序,它需要使用现有的存储过程来接收params中的ID或值。 我的任务分为两步:
1-迁移存储过程以便接收ID列表(int)和当前参数列表,就像表格一样
2-实现cal这个程序的层并将接收List和KeyValuePair或KeyValuePair
这样做的最佳方法是什么?
EntityFramework包装SP或不包含ORM? 如何实现List和KeyValuePair params ob SP方面?有表值的参数?
我正在使用SQL 2012
感谢,
答案 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中的所有内容,这是可能的。