我已经制作了像这样的动态存储过程
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返回整数返回类型
那么如何根据我传递给它的选择查询来设置存储过程的返回类型
我如何修改我的存储过程,使其返回类型为任何特定的表类型
答案 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));
可能这应该工作,我相信你只在这个参数中传递列名。