如何缓解 GridReader 中的“未选择任何列”异常

问题描述 投票:0回答:1

我在调用时从 Dapper.SqlMapper.GridReader 收到此异常

var resultSet = await SqlConnection.QueryMultipleAsync(query, parameters, commandType: CommandType.StoredProcedure);
var results = await resultSet.ReadAsync<resultDb>();

在 /_/Dapper/SqlMapper.cs:line 3291 等中的 Dapper.SqlMapper.GetTypeDeserializerImpl(Type type, DbDataReader reader, Int32 startBound, Int32 length, Boolean returnNullIfFirstMissing) 处未选择任何列*

这是 GridReader 中没有可用行的自然结果,但我想在代码中减轻这种情况而不进行异常处理。

不幸的是,

GridReader.IsConsumed
在我的情况下产生错误(可能是由于输出参数?),所以我不能使用它作为开关。

我正在寻找某种方法来访问

GridReader.Reader.HasRows
而无需反射,因为它会为我的场景产生正确的 false,但我似乎找不到它暴露在任何地方。

有什么方法可以做到这一点? (我不是在寻找“返回虚拟行”答案)

t-sql dapper resultset
1个回答
0
投票

不会引发此异常,因为 GridReader 中没有行。

抛出此异常是因为 GridReader 中没有columns

例如,像这样的过程将导致此异常发生:

CREATE PROCEDURE Test AS
BEGIN
    IF 1=0
        RETURN;

    SELECT * FROM test_table;
END

为了防止发生此异常,请不要在未返回至少空集的情况下从过程中返回。例如这样:

CREATE PROCEDURE Test AS
BEGIN
    IF 1=0
    BEGIN
        -- returning empty set with a schema
        SELECT TOP 0 * FROM test_table;
        RETURN;
    END

    SELECT * FROM test_table;
END

AFIK 不幸的是,Dapper 目前没有 GridReader 中可用结果集的计数。这些信息在这里可能非常有用。

© www.soinside.com 2019 - 2024. All rights reserved.