我使用存储过程从SQL Server返回数据。但是,我使用FETCH NEXT
来获取数据,这意味着如果没有返回数据,我会得到这个错误:
为FETCH子句提供的行数必须大于零。
因此,我需要将SELECT
语句包装在IF
语句中,因此只有在返回数据时才调用SELECT
:
IF @TotalCount > 0
BEGIN
SELECT
...
OFFSET @SkipResults ROWS
FETCH NEXT @PageSize ROWS ONLY
END
然后使用此命令将数据作为DbSet获取:
var data = await dbContext.MyDataSet.FromSqlRaw("EXECUTE myProcedure @Param1, @Param2", param1, param2).ToListAsync();
其中dbContext.MyDataSet
定义为:
DbSet<MyDataModel> MyDataSet { get; set; }
和MyDataModel
具有以下属性:
public class MyDataModel
{
public int CompletedPercentage { get; set; }
public string Title { get; set; }
public string Code { get; set; }
}
我遇到的问题是,当@TotalCount
在存储过程中为0时,没有数据从存储过程返回。
要求的列'CompletedPercentage'不存在于'FromSql'操作的结果中。
是否有一种使用存储过程来填充我的DbSet<MyDataModel> MyDataSet
属性的替代方法,在返回数据或不返回数据时都有效?
谢谢你的建议,你给我指明了正确的方向。
我已经删除了IF
语句,并将检查移到WHERE子句中,因为我希望这将意味着如果@TotalCount = 0
SELECT
语句将不会执行。SELECT
...
WHERE
@TotalCount > 0
OFFSET @SkipResults ROWS
FETCH NEXT @PageSize ROWS ONLY
我在存储过程中也有一些逻辑,我没有包括在问题中…
IF @PageSize < 1
SET @PageSize = @TotalCount
已更改为
IF @PageSize < 1
SET @PageSize = CASE WHEN @TotalCount > 0 THEN @TotalCount ELSE 1 END
这修复了由FETCH NEXT @PageSize
创建的错误,我现在可以得到我需要的空数据集。