.net LINQ to SQL中的存储过程存在问题

.net LINQ to SQL中的存储过程存在问题,.net,linq-to-sql,stored-procedures,.net,Linq To Sql,Stored Procedures,我在尝试从控制器调用存储过程时遇到了一个永无止境的问题——如果可以的话,我会为此添加一个悬赏,因为它已经花费了太多的时间,我不知道还能做什么(但我没有要点)。根据我的研究,这似乎是一个已知的bug,但没有一个变通方法对我有效,因此我将尽全力解释,希望找到解决方案: 1-我创建了一个如下所示的存储过程: CREATE PROCEDURE [dbo].[db_name] @start_dt datetime, @end_dt datetime AS BEGIN SET FMT

我在尝试从控制器调用存储过程时遇到了一个永无止境的问题——如果可以的话,我会为此添加一个悬赏,因为它已经花费了太多的时间,我不知道还能做什么(但我没有要点)。根据我的研究,这似乎是一个已知的bug,但没有一个变通方法对我有效,因此我将尽全力解释,希望找到解决方案:

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-我尝试将存储的proc作为函数拖到VS designer中的实体对象上-但它不允许我这样做,因为它说“返回的模式与目标类不匹配”。所以我只是把它拖到别处,然后创建了一个函数(我甚至更改了对象的返回类型,但不起作用,见下文)

**注意:我相信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>
我猜这可能是罪魁祸首的最后一行。

随机猜测

我估计
设置得很好
;正在阻止对存储过程的正确分析。我记不起确切的原因,但我知道有些客户对此有问题(如Reporting Services和临时表)

我在多年的SQL代码蒙骗中从未使用过它

编辑:为什么不
上设置NOCOUNT


这将作为第二个记录集(Ok,tiny)返回,这可能会导致它。这件事也请你考虑一下。。例如,它可能会搞乱nHibernate。

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

谢谢..但这是我读过并尝试过的“修复”之一-帮助Visual Studio猜测正确的SP输出。有没有它都有问题。我还注意到,SP导入创建的函数返回的“日期”被设置为字符串-我会解决这个问题(当我知道如何解决时),但我不认为它会解决返回int的主要问题。就像我说的,我是.Net MVC的新手,正在尝试找出最佳实践。我唯一的问题是你所说的“简单对象图”是什么意思?您是否建议我创建一个viewmodel来表示要用函数或类似于直接绑定的其他内容填充的值?谢谢。是的,只需创建一个函数来执行该过程并返回封装在对象中的值。然后,您可以对.NET中的上述数据执行任何操作。
No rows affected.
(129 row(s) returned)
@RETURN_VALUE = 0