LINQ-to-SQL中存储过程的问题

时间:2010-07-27 18:51:46

标签: .net linq-to-sql stored-procedures

我在尝试从控制器调用存储过程时遇到了一个永无止境的问题 - 如果我可以为此添加赏金,因为它已经花了太多时间而且我不知道还有什么要做(但我没有积分)。根据我的研究,它似乎是一个已知的错误,但不是解决方法对我有用,所以我会尽力解释希望找到解决方案:

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

我猜这可能是最后一行是罪魁祸首。

2 个答案:

答案 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。