【问题标题】:No return type in Linq2SQL for stored procedure存储过程的 Linq2SQL 中没有返回类型
【发布时间】:2021-03-11 08:28:13
【问题描述】:

我已经用 SQL 编写了一个存储过程,并希望在我的 Linq2SQL 设计器中使用它。因此,我像往常一样将它从 Visual Studio (2019) 中的服务器资源管理器拖放到我的设计器中,但此过程的返回类型为 None。 似乎很清楚,当我查看我的 SQL 过程时没有返回值,因为它使用 EXEC 执行查询,但我可以在 SQL Server Management Studio 中看到结果。

这是我的存储过程:

CREATE PROCEDURE [dbo].[ret_VAL]

    @ITEMNR nvarchar(255), 
    @COLUM_NAME nvarchar(255)
    
AS
    DECLARE @query AS NVARCHAR(max)
    SET @query = N'SELECT ' + @COLUM_NAME + ' AS VALUE FROM [PROD].[dbo].[MMView] Where ITEMNUMBER like ''' + @ITEMNR + ''''
  EXEC (@query) 
GO

当我在 SSMS 中运行存储过程时,我得到了一个结果,但我无法在 Linq2SQL 中使用它。当然,我可以将它拖放到我的 Linq2SQL 设计器中,但它没有返回类型。有人可以告诉我这里缺少什么,以获得返回类型(返回值)吗?

【问题讨论】:

    标签: sql-server stored-procedures linq-to-sql


    【解决方案1】:

    L2S 设计器无法确定动态执行查询的返回类型。

    您在“@colum_name”参数中传递的所有列的数据类型是否相同?

    如果是这样,如果您暂时将存储的过程更改为:

    CREATE PROCEDURE [dbo].[ret_VAL]
    
        @ITEMNR nvarchar(255), 
        @COLUM_NAME nvarchar(255)
        
    AS
        SELECT top 1 somecolumn AS VALUE FROM [PROD].[dbo].[MMView] Where 1=0
    GO
    

    ...然后将其添加到 L2S 设计器,然后它应该在 datacontext 中获得正确的返回类型定义。然后您可以将存储的过程更改回原始定义。

    但是,如果列是不同的数据类型,那么这将不起作用,因为定义只会匹配您在临时更改的存储过程中使用的列。

    【讨论】:

    • 哦,真是个好技巧。 :) 这很有帮助。但正如你所说。有一列具有另一种数据类型,然后其他列具有。这个是十进制类型,其他的是char类型。因此,当我传入具有十进制作为数据类型的列的名称时,我得到了一个强制转换异常。
    • 是的,如果有不同的数据类型,那么您需要为每种类型定义一个 SP。 ...或者可能更容易完全跳过 SP 并将其作为 linq 查询直接针对表/视图进行。如果目标是让它有点动态并在运行时选择列,那么 System.Linq.Dynamic 可能是一个选项:weblogs.asp.net/scottgu/…
    • 我将忽略这一列,因为我不需要它。感谢上帝,只有一列具有不同的类型。 :D 我会把你的答案标记为正确答案。
    • 顺便说一句,感谢您提供的非常有趣的链接。
    • 谢谢 :) 该链接已有几年的历史,因此某处可能有较新版本的 System.Linq.Dynamic。但是,那个原始的仍然很好用,所以我仍然在很多地方使用它。
    猜你喜欢
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 2018-01-31
    相关资源
    最近更新 更多