【问题标题】:Why is my output parameter in stored procedure called from Entity Null?为什么我的存储过程中的输出参数是从实体 Null 调用的?
【发布时间】:2015-02-22 22:36:14
【问题描述】:

我正在调用一个存储过程并声明一个输出参数:

CREATE PROCEDURE dbo.usp_getIsReadyForProcess
@VideoId INT ,
@val INT OUTPUT
AS
BEGIN
BEGIN TRY
    BEGIN TRANSACTION
-- LOCK ROW UNTIL END OF TRANSACTION
        SELECT * FROM dbo.ProcessStatus WITH (ROWLOCK, HOLDLOCK) WHERE VideoId = @VideoId

然后在整个事务中设置值

  --If there is no row count
IF @@ROWCOUNT = 0
BEGIN
    SET @val = 0
END

-- If video is already in process
ELSE IF @statusCode > 1
BEGIN
    SET @val = 0
END

...... more if blocks

          -- RELEASE LOCK
    COMMIT TRANSACTION
END TRY   

这里是获取输出参数的c#代码:

        using (var db = EntityFactory.GetInstance())
        {
            ObjectParameter objParam = new ObjectParameter("val", typeof(int));
            db.usp_getIsReadyForProcess(videoId, objParam);

            return (int)objParam.Value == 1;
        }

...但是无论我做什么,objParam.Value 都是 null。

所以我更深入地挖掘并发现了一个已经处理过的异常,

消息: 只能在 Type.IsGenericParameter 为 true 的类型上调用方法。

我做错了什么?我试过 type(bool, int32, string) .. 没有用

【问题讨论】:

  • 我不确定 EF 是否支持输出参数。
  • 你看过这个帖子吗:stackoverflow.com/questions/5881359/…
  • @DavidTansey 嗯,很好的链接。所以在检查返回值之前需要确保过程已经执行。

标签: c# sql-server entity-framework stored-procedures output-parameter


【解决方案1】:

由于这一行,您的存储过程返回了一个结果集:

SELECT * FROM dbo.ProcessStatus WITH (ROWLOCK, HOLDLOCK) WHERE VideoId = @VideoId

您可以将 SQL 更改为:

DECLARE @RowCount INT
SELECT @RowCount = COUNT(*) FROM dbo.ProcessStatus WITH (ROWLOCK, HOLDLOCK) WHERE VideoId = @VideoId

或者您可以在代码中捕获结果集:

var resultSet = db.usp_getIsReadyForProcess(videoId, objParam);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 2023-04-08
    相关资源
    最近更新 更多