Я использую метод Dapper
QueryMultipleAsync
для чтения множества результатов.Моя хранимая процедура проверяет некоторые условия (например, пользователь может пытаться получить чужие данные, отправив идентификатор в мой API), чтобы определить, должны ли данные возвращаться или нет.
I, на стороне C #, сначаланеобходимо прочитать return value
(не набор результатов), чтобы определить, возвращены ли данные или SP просто возвратил 3 (что означает недостаточные права).Чтобы проиллюстрировать случай:
IF @UserRole < 10
BEGIN
RETURN 3; -- Insufficient rights.
END
IF @IsCurrentUserOwner = 0
BEGIN
RETURN 5; -- Not owner.
END
-- Get users.
SELECT
Id
, [Name]
, LastName
FROM
Users
-- WHERE ...
-- Get chat messages.
SELECT
*
FROM
ChatMessages
-- WHERE ...
Я знаю, что значения output
и return
записываются в конце считывателя, поэтому я могу прочитать возвращаемый параметр, только когда все данные (набор результатов) прочитаны.Поэтому мне всегда нужно сначала прочитать набор результатов, а затем вернуть / вывести параметры.
Что если бы мой SP
выглядел так:
-- ...some code above...
IF @IsCurrentUserOwner = 0
BEGIN
RETURN 5; -- Not owner.
END
DECLARE @RType TINYINT = NULL
-- some other code here to get @RType value here...
SELECT @RType -- To make this a result so QueryMultiple's reader can read this.
-- ...some other code to get users and chat messages...
Для описания проблемы:
Переменная
@RType
может быть 5
, а также возвращаемым значением SP
.Когда я сначала читаю результат (так как параметры вывода / возврата находятся в конце считывателя), как узнать, что только что прочитанное значение (в данном случае 5
) является @RType или возвращаемым значением?(они конвертируемы)
Вот так примерно выглядит мой код C #:
var parameters = new DynamicParameters();
parameters.Add("@RetVal", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);
var dbResult = await Context.SqlConnection.QueryMultipleAsync(sql: "my_sp_name", param: parameters, commandType: CommandType.StoredProcedure)
// Some code here...
using (var reader = dbResult)
{
var rType = reader.Read<byte>(); // <----- How to know if I read @RType or just return value of SP since they are convertible to each other?
var users = reader.Read<User>();
var chatMessages = reader.Read<ChatMessage>();
// ...
}
var returnValue = parameters.Get<int>("@RetVal");
if (returnValue == 5)
{
return "You are not allowed to see this data";
}
Как вы рекомендуете мне обращаться с делом?