如何根据特定表设置存储过程的返回类型

时间:2013-09-19 09:49:08

标签: c# sql-server stored-procedures ado.net-entity-data-model

我已经制作了像这样的动态存储过程

CREATE PROCEDURE [dbo].[MyProcedure]
    @pSelect nvarchar(max)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @SQL nvarchar(max)

    SET @SQL = 'select ' + @pSelect + ' from tabel1';

    EXEC (@SQL)
END

在更新我的entitydatamodel上的context.cs中,上面的存储过程是

的形式
 virtual int MyProcedure(string pSelect)
            {
                var pSelectParameter = pSelect != null ?
                    new ObjectParameter("pSelect", pSelect) :
                    new ObjectParameter("pSelect", typeof(string));

                return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("MyProcedure", pSelectParameter);
            }

从c#代码

调用存储过程
var result = myDataModel.MyProcedure("Select * From table1").tolist();

上面的代码显示错误,因为MyProcedure返回整数返回类型
那么如何根据我传递给它的选择查询来设置存储过程的返回类型

我如何修改我的存储过程,使其返回类型为任何特定的表类型

2 个答案:

答案 0 :(得分:1)

在这种情况下,你必须欺骗代码。

CREATE PROCEDURE [dbo].[MyProcedure]
    @pSelect nvarchar(max)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @SQL nvarchar(max)

    SET @SQL = 'select ' + @pSelect + ' from tabel1';

    EXEC (@SQL)

   --Remove the below line once you have added the stored procedure to the dbml file.
    select * from table1
END

创建sp后,拖放到c#dbml文件。然后你可以通过删除“select * from table1”这一行来改变sp。

注意:如果你在table1中没有这些列,那么select语句中的直接值(任何数据类型)就像“select 1 as colmumn1,'string'as colmumn2,cast('10 / 01/1900'as datetime )作为table1“

的colmumn3

答案 1 :(得分:1)

只需在参数中添加@符号即可。

 var pSelectParameter = pSelect != null ?
                new ObjectParameter("@pSelect", pSelect) :
                new ObjectParameter("@pSelect", typeof(string));

可能这应该工作,我相信你只在这个参数中传递列名。