У меня есть следующий код C# и SQL серверная хранимая процедура.
private static long GetTestBigintOutput(SqlConnection dbConn)
{
var sqlParams = new DynamicParameters();
sqlParams.Add("@input_param", 1);
sqlParams.Add("@output_param", SqlDbType.BigInt, direction: ParameterDirection.Output);
dbConn.Execute("stp_zzz_test_output_bigint", sqlParams, commandType: CommandType.StoredProcedure);
var output = sqlParams.Get<long>("@output_param");
return output;
}
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
try
{
var output = GetTestBigintOutput(GetDbConnection());
Console.WriteLine($"Output = {output}");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadKey();
}
Хранимая процедура:
CREATE PROCEDURE stp_zzz_test_output_bigint
(@input_param bigint,
@output_param bigint OUTPUT)
AS
BEGIN
SET @output_param = @input_param
END
Результатом этого простого консольного приложения является
Привет, мир! Невозможно привести объект типа System.Int32 к типу System.Int64.
Ожидается ли этого? Другие мои хранимые процедуры возвращают значения, привязанные к BIGINT
столбцам, но фактическое возвращаемое значение умещается в Int32
. Однако я не могу быть уверен заранее, каким будет фактическое возвращаемое значение, и это изменится после запуска программы.
Я знаю, что могу изменить
var output = sqlParams.Get<long>("@output_param");
на
var output = sqlParams.Get<dynamic>("@output_param");
Однако я чувствую, что это своего рода обман.
Есть какие-нибудь мысли?
относительно Пола