存储过程的返回值是正确的,但列值都是NULL

时间:2009-12-10 01:08:09

标签: c# linq stored-procedures

我正在使用C#成员资格提供程序并将其传输到LINQ。

我在从MS SQL中的存储过程中提取结果时遇到问题。 该过程可以设置变量,然后在设置返回值0之前选择变量。

当我在MS SQL中运行它来测试它工作正常。 当我使用常规命令对象和C#中的阅读器运行它时,它可以正常工作。 但是,当我使用LINQ运行它时,我无法获得结果,只返回值。

SQL过程

ALTER PROCEDURE [dbo].[TEST] AS BEGIN

    **... DO WORK TO DECLARE AND SET VARIABLES ....**

    SELECT   @Password, @PasswordFormat, @PasswordSalt, @FailedPasswordAttemptCount, FailedPasswordAnswerAttemptCount, @LastLoginDate, @LastActivityDate, @Status_Flag

    RETURN 0 
END

MSSQL结果集

host | 0 | NULL | 0 | 0 | 2009-09-22 00:57:22.700 | 2009-12-09 16:35:05.607 | 1

(1 row(s) affected)

Return Value 0

(1 row(s) affected)

LINQ

var x = (from b in _linq.TEST()
         select b).Single();

LINQ结果

NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL

Return Value 0

我还验证了从LINQ发送的sql与我在MSSql中输入的内容似乎相同。

以下是我尝试过的所有LINQ(并在调试器中查看以查看结果):

// allow linq to create custom TESTResult type 
var result1 = _linq.TEST();

// get the return value from the type created above 
object p = result1.ReturnValue;

// get the single result set from SP into the TESTResult type 
TESTResult result = _linq.TEST().Single();

// try to see one column to ensure null values aren't causing issues 
var y = (from b in _linq.TEST() select b.Column1).Single();

// try querying result set from LINQ 
var x = (from b in _linq.TEST() select b).Single();

我也尝试过使用数据库来更改列值并删除空值。

4 个答案:

答案 0 :(得分:0)

如果您想在结果集之前生成一个或多个结果,请尝试

Set NoCount On 
在你的过程开始时

我不知道它如何与LINQ一起使用,但是对于具有中间结果集的ADO和ADO.NET,提供程序将无法返回您想要的结果,因为它不知道如何处理中间计数。

现在进行修改

我找不到任何LINQ样本使用返回行,该行仅由存储过程本地变量组成。如果你知道它可以这样工作,那很好,让我知道,我会学到一些东西。我找到的是LINQ能够绑定到OUTPUT参数。

http://msdn.microsoft.com/en-us/library/bb386975.aspx

如果您还没有运气,请尝试添加您要返回的变量作为proc的默认输出参数。 (当然,删除最后的选择)

再次,LINQ不是我的强项,但我希望这有帮助。

答案 1 :(得分:0)

您是否尝试为结果指定列名?也许Linq在没有列名的情况下处理结果有问题。

SELECT @Password Password, @PasswordFormat PasswordFormat, etc...

答案 2 :(得分:0)

可能你想要相反的

 set nocount off

我看过很多博客帖子,人们说他们不得不拒绝这些。在您的查询工具中它显然已关闭,但您的应用连接怎么样?在过程中明确设置nocount,看看它是否有效。既然您在调试器中看到了结果,也许没有计算它抛出LINQ?

答案 3 :(得分:0)

这是一些事情的结合,最终以我尝试的第一件事和罗恩的建议结束。必须将列命名为使用LINQ拉取。

LINQ可以返回仅由变量(或您选择的任何内容)组成的行;但是,我没有意识到,即使我更改了传递的信息或更改了MSSql中的SP并将其重新添加到LINQ设计器,Vis Studio中与数据库的连接也就是缓存存储过程的结构。所以......无论我在LINQ设计器中删除并重新添加存储过程时我尝试改变的是什么,它总是使用存储过程的缓存表示。经过大量测试后,我发现获得一个新的唯一方法是实际关闭Vis Studio并重新启动它以打开新的数据库连接并获得新的SP结构(如果我错了,请纠正我)。

感谢大家的帮助和建议。