我们如何从存储过程中返回值
这是我的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' 可以找到(你错过了吗? 使用指令或程序集 引用?)
答案 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。