我在尝试从控制器调用存储过程时遇到了一个永无止境的问题 - 如果我可以为此添加赏金,因为它已经花了太多时间而且我不知道还有什么要做(但我没有积分)。根据我的研究,它似乎是一个已知的错误,但不是解决方法对我有用,所以我会尽力解释希望找到解决方案:
1-我创建了一个如下所示的存储过程:
CREATE PROCEDURE [dbo].[db_name]
@start_dt datetime,
@end_dt datetime
AS
BEGIN
SET FMTONLY OFF;
SELECT [date],
COUNT(visits) as Visits,
SUM(CASE entrance WHEN '1' THEN 1 ELSE 0 END) AS ENT1,
SUM(CASE entrance WHEN '2' THEN 1 ELSE 0 END) AS ENT2,
SUM(CASE entrance WHEN '3' THEN 1 ELSE 0 END) AS ENT3,
SUM(CASE entrance WHEN '4' THEN 1 ELSE 0 END) AS ENT4,
SUM(CASE entrance WHEN '5' THEN 1 ELSE 0 END) AS ENT5
FROM some_view
WHERE [date] between @start_dt and @end_dt
group by [date]
END
2 - 然后我手动创建了一个LINQ to SQL实体对象,该对象具有上述每个返回列(Date,Visits,ENT1,ENT2 ... ENT5)的属性。
3 - 我尝试将存储过程作为一个函数拖到VS设计器中的所述实体对象上 - 但它不允许我这样说“返回的模式与目标类不匹配”。所以我只是将它拖到其他地方并创建了一个函数(我甚至将返回类型更改为对象但没有工作,请参阅下文)。
**注意:我相信Visual Studio认为存储过程返回Int - 而不是预期的值表。 **针对此类问题的建议修复方法是创建一个虚拟存储过程,该过程只有一个简单的select语句,并在将其拖动到对象后将其替换但不起作用
4 - 我在控制器中尝试了我能想到的一切,例如在调用存储过程并尝试将其转换为模型对象时尝试返回IMultipleResults而没有任何成功。
主要问题似乎是没有返回行,只是一个int。
提前感谢您的帮助!我是MVC的新手,所以请随时告诉我,如果你认为它是关闭的话。
更新,这是生成的模型XML:
<?xml version="1.0" encoding="utf-8"?>
<Database Name="DB_Name" Class="nameDataContext" xmlns="http://schemas.microsoft.com/linqtosql/dbml/2007">
<Connection Mode="WebSettings" ConnectionString="Data Source=some_data_source;Initial Catalog=some_db;Integrated Security=True" SettingsObjectName="System.Configuration.ConfigurationManager.ConnectionStrings" SettingsPropertyName="name_ConnectionString" Provider="System.Data.SqlClient" />
<Table Name="" Member="Visits">
<Type Name="Visit">
<Column Name="Date" Type="System.DateTime" CanBeNull="false" />
<Column Name="Visits" Type="System.Int32" CanBeNull="false" />
<Column Name="ENT1" Type="System.Int32" CanBeNull="false" />
<Column Name="ENT2" Type="System.Int32" CanBeNull="false" />
<Column Name="ENT3" Type="System.Int32" CanBeNull="false" />
<Column Name="ENT4" Type="System.Int32" CanBeNull="false" />
<Column Name="ENT5" Type="System.Int32" CanBeNull="false" />
</Type>
</Table>
<Function Name="dbo.sp_proc_name" Method="sp_proc_name">
<Parameter Name="start_dt" Type="System.DateTime" DbType="DateTime" />
<Parameter Name="end_dt" Type="System.DateTime" DbType="DateTime" />
<ElementType Name="sp_proc_nameResult">
<Column Name="date" Type="System.String" DbType="VarChar(30)" CanBeNull="true" />
<Column Name="Visits" Type="System.Int32" DbType="Int" CanBeNull="true" />
<Column Name="ENT1" Type="System.Int32" DbType="Int" CanBeNull="true" />
<Column Name="ENT2" Type="System.Int32" DbType="Int" CanBeNull="true" />
<Column Name="ENT3" Type="System.Int32" DbType="Int" CanBeNull="true" />
<Column Name="ENT4" Type="System.Int32" DbType="Int" CanBeNull="true" />
<Column Name="ENT5" Type="System.Int32" DbType="Int" CanBeNull="true" />
</ElementType>
</Function>
</Database>
更新2 当我在Visual Studio中运行存储过程时,输出是一组行,后跟:
No rows affected.
(129 row(s) returned)
@RETURN_VALUE = 0
我猜这可能是最后一行是罪魁祸首。
答案 0 :(得分:4)
没有法律规定必须使用Linq2Sql或EF或nHibernate或SubSonic或其他任何MVC。那么为什么不写一个小的静态函数来调用proc并将结果作为一个简单的对象图返回,而不是为了一个非常直接的RPC场景而烦恼整个ORM。
答案 1 :(得分:0)
随机猜测......
我估计SET FMTONLY OFF
;阻止正确解析存储过程。我不记得原因,但我知道有些客户有问题(如Reporting Services和临时表)
我从未在多年的SQL代码中使用它......
编辑:为什么没有SET NOCOUNT ON
?
这是作为可能导致它的第二个记录集(Ok,tiny)返回的。请see my question关于此问题......例如,它可能会破坏nHibernate。