Linq to SQL使用StoredProcedure - 如何返回值(插入,更新,删除)

时间:2010-07-22 19:04:56

标签: linq linq-to-sql

我们如何从存储过程中返回值

这是我的sp看起来像:

create proc dbo.spInsertGroup
@ID uniqueidentifier
@GroupName varchar(100),
@IsActive bit
AS
BEGIN



insert into tblGroup
values(@ID, @GroupName, @IsActive)

Select @@IDENTITY AS ID

END

根据返回值我想向用户显示某种反馈,保存是成功还是失败。

public void AddInquiry(Inquiry inq)
{
   using (var transaction = new TransactionScope())
   {
      using (MyDataContext dc = conn.GetContext())
      {
         var results =  dc.spInquiry_Insert(......).ToList();

         transaction.Complete();

         var returnValue = (int)results.ReturnValue; 
         // note that ReturnValue is of type object and must be cast. 
      }
   }
}

错误:

  

错误39'System.Collections.Generic.List'   不包含的定义   'ReturnValue'并没有扩展方法   'ReturnValue'接受第一个   类型的论证   'System.Collections.Generic.List'   可以找到(你错过了吗?   使用指令或程序集   引用?)

3 个答案:

答案 0 :(得分:1)

尝试:

using (MyDataContext dc = conn.GetContext())
{
    var returnValue = (int)dc.spInsertGroup(.......).ReturnValue;
}

您收到该错误是因为您正在调用.ToList(),因此var结果的类型为List<>没有ReturnValue属性。

如果看不到ReturnValue属性,可能需要更新LINQ生成的方法

答案 1 :(得分:0)

对于像ID这样的标量值,我相信你只是说“RETURN @ID”

对于行集,我相信你选择它,类似于你的例子,Linq2Sql将它作为IEnumerable<>导入。

更新

由于您使用了SELECT,因此L2S创建了List<T>。由于select中的值是整数,因此它是List<int>,只有一个元素。要检索它,它只是results[0]

或者您可以将存储过程更改为return @ID,并使用:

var id =  dc.spInquiry_Insert(......);

答案 2 :(得分:0)

除了存储过程中的INT之外,您不能返回任何内容,但是,您尝试发送 GUID - 这将无效。您需要将存储过程重写为:

CREATE PROCEDURE dbo.spInsertGroup
    @GroupName varchar(100),
    @IsActive bit,
    @ID uniqueidentifier OUTPUT
AS .......

然后在你的存储过程中简单地使用SET @ID = NEWID()就足够了 - 这很好。

您的C#代码现在看起来像:

using(YourDataContext ctx = new YourDataContext())
{
    Guid? newID = new Guid();
    bool? active = true;

    int retVal = ctx.spInsertGroup2("test", active, ref newID);
}

newID将在通话后包含新ID。