【发布时间】:2010-07-27 18:51:46
【问题描述】:
我在尝试从控制器调用存储过程时遇到了一个永无止境的问题 - 如果可以的话,我会为此增加一个赏金,因为它已经花费了太多时间而且我不知道还有什么要做(但我没有要点)。根据我的研究,这似乎是一个已知的错误,但没有一种解决方法对我有用,所以我会尽力解释,希望有一个解决方案:
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 实体对象,该对象具有上述每个返回列(日期、访问、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
我猜这可能是罪魁祸首的最后一行。
【问题讨论】:
-
我还注意到,由 SP 导入创建的函数的返回“日期”设置为字符串 - 我会解决这个问题(当我能弄清楚如何解决时)但我不这么认为'将解决返回 int 的主要问题。
标签: .net linq-to-sql stored-procedures