我在调用时从 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,但我似乎找不到它暴露在任何地方。
有什么方法可以做到这一点? (我不是在寻找“返回虚拟行”答案)
不会引发此异常,因为 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 中可用结果集的计数。这些信息在这里可能非常有用。