【问题标题】:Using LINQ to get values from Stored Procedure使用 LINQ 从存储过程中获取值
【发布时间】:2013-09-28 07:10:53
【问题描述】:

我正在使用 LINQ 和 DataContext 来检索我的数据。我不使用实体框架。现在我有一个我不知道的存储过程

  1. 如何提供参数和
  2. 如何定义(单值)并从中获取结果。

存储过程是这样定义的:

CREATE PROCEDURE [dbo].[spGetConvertedFieldValue] 
-- Add the parameters for the stored procedure here
    @Table NVARCHAR(50),
    @Field NVARCHAR(50),
    @Key NVARCHAR(50),
    @KeyValue NVARCHAR(500)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

    DECLARE @SQL NVARCHAR(MAX)

    SET @SQL = 'SELECT ' + @Field + ' FROM ' + @Table + ' WHERE ' + @Key + ' = ''' + @KeyValue + ''''

EXEC(@SQL)
END

如您所见,这是一个非常通用的存储过程!这样做的原因是,我有另一个表格,可以在其中输入上述值,系统将能够构建我的最终结果。

但我这里有点存货。我已经阅读了文章:http://www.codeproject.com/Articles/37938/Simple-6-steps-to-use-stored-procedure-in-LINQ,其中指定了如何调用存储过程。但有一件事是,我似乎至少应该能够定义我指的是哪个表(步骤 2)

此外,上面的文章没有描述如何添加我的论点。

如果可以不使用存储过程来创建结果,那也是一种选择!

【问题讨论】:

  • 当您将存储过程从数据源窗口拖到 Visual Studio 的 dbml 设计器中时,它不会自动完成所有这些操作吗?
  • 那么问题是:为什么不呢?您不需要创建完整的实体模型。只需添加一个 LINQ to SQL 数据集并将您的 SP 拖到视图中。然后就可以调用了。
  • 您不需要创建完整的实体模型。只需添加一个 LINQ to SQL 数据源并将存储过程拖到视图中。然后你可以调用它。我快速浏览了您链接的 CodeProject 文章,基本上他们似乎在做同样的事情,只是在代码中。
  • 非常感谢...会试一试并得到结果。也很抱歉删除评论(在您的第一条评论之后)。原因是我完全搞混了:-)
  • 哦,我已经想知道我的互联网连接是否有问题。我们有时在工作中确实遇到了这个问题,所以我没想到你可能已经删除了它:-)

标签: c# sql linq stored-procedures


【解决方案1】:

好的,这是解决方法:

首先我创建一个名为 TemporaryParking 的新表:

CREATE TABLE [dbo].[TemporaryParking](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Field] [nvarchar](max) NULL,
 CONSTRAINT [PK_TemporaryParking] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  =     ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 10) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

接下来我创建一个存储过程,它可以填充我的表并返回新插入值的 id:

CREATE PROCEDURE [dbo].[spGetConvertedFieldValue] 
-- Add the parameters for the stored procedure here
@Table NVARCHAR(50),
@Field NVARCHAR(50),
@Key NVARCHAR(50),
@KeyValue NVARCHAR(500)
AS
BEGIN
SET NOCOUNT ON;

DECLARE @SQL NVARCHAR(MAX)

SET @SQL = 'INSERT INTO TemporaryParking (Field) SELECT ' + @Field + ' FROM ' + @Table + ' WHERE ' + @Key + ' = ''' + @KeyValue + ''''

EXEC(@SQL)

RETURN @@Identity   
END

在我的应用程序中,我创建了一个“包含”我的存储过程 spGetConvertedFieldValue 的 .dbml 文件。

调用此过程时,它会从插入的值返回 Id,然后我可以创建一个简单的 LINQ 语句来获取值:

'lets assume that I now have the Id in a variable calle tmpId

var rv = (from f in _db.TemporaryParking
         where f.Id == tmpId
         select f.Field).First();

如果我愿意,我什至可以通过再次从 TemporaryParking 中删除值来进行清理。

感谢 Thorsten Dittmar 为我指明了正确的方向!不过,您的回答并没有解决问题。

【讨论】:

    猜你喜欢
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 2013-01-22
    • 2013-04-22
    • 1970-01-01
    相关资源
    最近更新 更多