我导入存储过程时,ententi框架6.0.0.0出现问题,无论我做什么,它都不会返回结果集,而是仅返回整数或设置为none。下面是sp。
alter proc spGetProd
@Prod nvarchar(500)
as
begin
SET FMTONLY OFF
IF OBJECT_ID('tempdb..##PRODUCTTABLE') IS NOT NULL DROP TABLE ##PRODUCTTABLE
DECLARE @MYQUERY nvarchar(MAX), @my_Div nvarchar(500);
set @my_Div = REPLACE(@Prod, ',', ''',''');
SET @MYQUERY = 'SELECT DISTINCT [GNo],[GName]
into ##PRODUCTTABLE FROM ABC
where Div IN ('''+@my_Div+''')
order by GNo'
EXEC (@MYQUERY)
SELECT GNo, GName FROM ##PRODUCTTABLE;
drop table ##PRODUCTTABLE;
end
不管我做什么,不管我做什么,都不要做SET FMTONLY OFF / ON
。我做了很久,它只工作了一次,当我设置SET FMTONLY OFF
然后将其删除时,它适用于该sp,但不适用于其他存储过程。即使我从select * from ##PRODUCTTABLE;
上面获得结果集或指定类似上面的列。这是我在MVC中的操作。
public JsonResult GetData()
{
var allProducts = gentity.spGetProd("AB"); //return type shows as int.
return Json(allProducts, JsonRequestBehavior.AllowGet);
}
还有其他解决方法吗,因为我的应用程序主要依赖于存储过程,这些存储过程通常从上述临时表中返回数据。
问题出在您的存储过程中。您的问题非常简单,并且使事情变得复杂。
只需在您的数据库中创建此函数即可。
CREATE FUNCTION dbo.SplitStrings
(
@List NVARCHAR(MAX),
@Delimiter NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(
SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
FROM
(
SELECT x = CONVERT(XML, '<i>'
+ REPLACE(@List, @Delimiter, '</i><i>')
+ '</i>').query('.')
) AS a CROSS APPLY x.nodes('i') AS y(i)
);
GO
现在您的存储过程应该看起来像
ALTER PROC spGetProd
@Prod nvarchar(500)
AS
BEGIN
SET NOCOUNT ON;
SELECT DISTINCT [GNo],[GName]
FROM ABC
WHERE Div IN (SELECT Item FROM dbo.SplitStrings(@Prod,','))
ORDER BY GNo;
END
没有临时表,没有额外的变量,没有EXEC,没有对象丢失。只需为您的EF一个明确的选择语句即可。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句