Без использования Dapper этот код возвращает правильный результат «true»:
using(connection= new SqlConnection(connectionString))
{
using(var cmd = connection.CreateCommand())
{
cmd.CommandText= query;
cmd.CommandType= CommandType.StoredProcedure;
cmd.CommandTimeout = commandTimeout;
var pDeviceId = new SqlParameter
{
ParameterName = "@DeviceId",
DbType = DbType.String,
Size = 150,
Direction = ParameterDirection.Input,
Value = parameter.DeviceId
};
cmd.Parameters.Add(pDeviceId);
var pResponse = new SqlParameter
{
ParameterName = "@Response",
DbType = DbType.Boolean,
Direction = ParameterDirection.Output,
};
cmd.Parameters.Add(pResponse);
await connection.OpenAsync();
int i = cmd.ExecuteNonQuery();
var response = (bool)cmd.Parameters["@Response"].Value;
return response;
}
}
Но при использовании Dapper я не могу заставить этот код работать. Он всегда возвращает значение «false»:
using (connection = new SqlConnection(connectionString))
{
using(var cmd = connection.CreateCommand())
{
var parameters = new DynamicParameters();
parameters.Add("@DeviceId", parameter.DeviceId);
parameters.Add("@Response", dbType: DbType.Boolean, direction: ParameterDirection.Output);
var reply = (await connection.QueryAsync<bool>(
query,
param: parameters,
commandType: System.Data.CommandType.StoredProcedure).ConfigureAwait(false)).FirstOrDefault();
return reply;
}
}
Привет @Ibanez, я думаю, вам следует использовать ExecuteAsync
вместо QueryAsync
, так как вам просто нужно значение из выходного параметра, но вам не нужен результат оператора SELECT. Проверьте мой последний ответ. Спасибо.
Пожалуйста, не добавляйте свое решение к вашему вопросу. Если ответ, который вы приняли, не содержит полного ответа, не стесняйтесь добавлять свой собственный.
Отсюда,
var reply = (await connection.QueryAsync<bool>(
query,
param: parameters,
commandType: System.Data.CommandType.StoredProcedure).ConfigureAwait(false)).FirstOrDefault();
это получит значение из оператора SELECT
из хранимой процедуры, но не значение из параметра Output
.
Чтобы получить значение из выходного параметра, вы должны сделать следующее:
await connection.ExecuteAsync(
query,
param: parameters,
commandType: System.Data.CommandType.StoredProcedure);
var reply = parameters.Get<bool>("@Response");
Рекомендации
Dapper/ProcedureTest.cs (метод TestDateTime2LosePrecisionInDynamicParameters)
Использование параметров с Dapper (раздел Dapper Output Parameter)
Хм. Какая может быть разница?
Результат тот же. Просто удалите ненужный код и используйте правильный подход.
Можете ли вы показать Stored Proc, который вы использовали?