【问题标题】:Linq to sql stored procedure return valueLinq to sql 存储过程返回值
【发布时间】:2012-06-27 17:54:01
【问题描述】:

我在 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 为单位的当前 DB 大小。

我希望它在应用程序中运行,所以我将它添加到 linq to sql 数据上下文中,生成以下代码:

    [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();

但是,它只返回零,从不返回任何其他值。也不会抛出任何类型的异常。 我尝试选择结果并使用输出参数,但这也无济于事(输出参数也为零)。有什么建议吗?

【问题讨论】:

  • 我无法直接回答您的问题,但作为一般建议,您可能会发现使用 SMO 从 .NET 应用程序获取 database properties 更容易。

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


【解决方案1】:

我遇到了同样的问题。听起来很愚蠢,您必须从存储过程返回包含您的值的单行和单列。 L2S 不会做类似于ExecuteScalar(...) 的事情。

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

【讨论】:

  • 你的意思是输出参数吗?我试过了,得到了同样的结果......除非你的意思是别的?
  • 不带输出参数,没有。标量值 UDF 应该可以正常工作。
  • 我必须求助于 UDF 吗?我在应用程序中有另一个 SP,我正在以完全相同的方式使用它,它工作正常(它有四个输出参数)
  • 我刚刚发现this post 可能会解决您的问题。
  • 我实际上只是做了类似的事情(尽管我将我的 SP 更改为 exec sp_spaceused)。感谢您的帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多