Linq以sql存储过程返回值

时间:2012-06-27 17:54:02

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

我在SQL Server 2005数据库中有以下存储过程(意味着只返回以MB为单位的数据库大小)。

ALTER PROCEDURE [dbo].[dbSize]
AS
BEGIN
SET NOCOUNT ON;

DECLARE @sizeMb int
DECLARE @DB_NAME varchar(100)

SELECT @DB_NAME = DB_NAME()

SELECT @sizeMb = (size*8)/1024 FROM sys.master_files
    WHERE DB_NAME(database_id) = @DB_NAME
    AND Name = @DB_NAME

RETURN @sizeMb  
END

当我在SQL Server Management Studio中运行它时,它可以正常工作,以MB为单位返回当前的数据库大小。

我想让它在应用程序中运行,所以我将它添加到linq到sql datacontext,它生成了以下代码:

    [global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.dbSize")]
    public int dbSize()
    {
        IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())));
        return ((int)(result.ReturnValue));
    }

我称之为:

int dbSize = db.dbSize();

然而,它只返回零,从来没有其他任何东西。也没有任何例外。  我尝试选择结果并使用输出参数,但这也没有帮助(输出参数也为零)。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。听起来很愚蠢,你必须返回一行,其中包含来自存储过程的值的单列。 L2S没有做类似于ExecuteScalar(...)的事情。

如果你使用 UDF ,你会有更好的运气。 This post很好地解决了这个问题。