【问题标题】:Problem with stored procedure in LINQ-to-SQLLINQ-to-SQL 中存储过程的问题
【发布时间】: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


【解决方案1】:

没有法律规定必须使用 Linq2Sql 或 EF 或 nHibernate 或 SubSonic 或任何与 MVC 一起使用的东西。那么为什么不写一个小的静态函数来调用 proc 并将结果作为一个简单的对象图返回,而不是为一个非常直接的 RPC 场景大惊小怪地使用整个 ORM。

【讨论】:

  • 就像我说的那样,我是 .Net MVC 的新手,并且一直在尝试找出最佳实践。我唯一的问题是“简单对象图”是什么意思?您是否建议我创建一个视图模型来表示要填充函数的值或其他类似直接绑定的值?谢谢。
  • 是的,只需创建一个函数来执行该过程并返回包装在对象中的值。然后,您可以在 .NET 中对所述数据执行任何操作。
【解决方案2】:

随机猜测...

我认为SET FMTONLY OFF;正在阻止正确解析存储的过程。我不记得确切原因,但我知道有些客户对此有疑问(例如 Reporting Services 和临时表)

而且我在多年的 SQL 代码猴子中从未使用过它......

编辑:为什么没有SET NOCOUNT ON

这作为可能导致它的第二个记录集(好的,很小)返回。也请see my question 讨论这个问题。例如,它可能会弄乱 nHibernate。

【讨论】:

  • 谢谢..但这是我阅读并尝试过的“修复”之一 - 帮助 Visual Studio 猜测正确的 SP 输出。不管有没有,问题都存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多