Microsoft no tiene ninguna documentación actual sobre los parámetros de salida, simplemente normal unos. Estoy usando .Net Core 3.0 con EF Core 3.0 e intento recuperar un parámetro de salida de mi procedimiento almacenado. Codifique de la siguiente manera:

var output=""
await _context.Database.ExecuteSqlInterpolatedAsync(
$"EXEC dbo.InsertTest @param1={"test"},@param2={"test2"}, @param3={output});

Lo que no sé es cómo estructurar la nueva API en 3.1 para especificar un parámetro de salida. Me pregunto si alguien tiene documentación sobre esto o lo ha hecho en la nueva actualización.

Gracias de antemano.

0
misteroptimist 24 feb. 2020 a las 21:36

2 respuestas

La mejor respuesta

Gracias a Eugene por ponerme en el camino correcto. En caso de que alguien se encuentre con este mismo problema:

Para obtener con éxito un parámetro de salida en 3.0, debe definir específicamente el parámetro de salida como SqlParameter () y luego incluir la palabra "OUT" después de su variable.

Este es un ejemplo del uso de ExecuteSqlInterpolated ()

var output = new SqlParameter();
output.ParameterName = "@ID";
output.SqlDbType = SqlDbType.Int;
output.Direction = ParameterDirection.Output;

await _context.Database.ExecuteSqlInterpolated(
"EXEC dbo.InsertTest @param1={"test"},@param2={"test2"}, @param3={output} OUT);

Este es un ejemplo del uso de ExecuteSqlRawAsync ()

var output = new SqlParameter();
output.ParameterName = "@ID";
output.SqlDbType = SqlDbType.Int;
output.Direction = ParameterDirection.Output;

await _context.Database.ExecuteSqlRawAsync(
"EXEC dbo.InsertTest @param1={0},@param2={1}, @param3={3} OUT, param1,param2,output);
2
misteroptimist 24 feb. 2020 a las 20:15

Existe una pequeña posibilidad de que crear param3 como DbParameter / SqlParameter con Direction establecido en Output puede funcionar:

var output = new SqlParameter("@param3", DbType.String)
    { Direction = ParameterDirection.Output };
await _context.Database.ExecuteSqlInterpolatedAsync(
    $"EXEC dbo.InsertTest @param1={"test"},@param2={"test2"}, @param3={output});
Console.WriteLine(output.Value);

Pero no estoy seguro de eso por lo que puedo ver en código fuente y no puedo verificarlo ahora con DB real.

Entonces, en el peor de los casos, solo tendría que soltar ExecuteSqlInterpolatedAsync y usar alguna forma estándar para ejecutar procedimientos almacenados que admitan parámetros de salida - Entity Framework Core - Uso del procedimiento almacenado con parámetros de salida

1
Eugene Podskal 24 feb. 2020 a las 19:31