Pase C # bool como parámetro a Oracle usando Dapper

c# dapper oracle

Pregunta

Estoy tratando de pasar un bool como parámetro a Oracle usando Dapper, traduciendo a un campo 1/0 en la base de datos, así:

public class Customer
{
    public bool Active { get; set; }
}
static void InsertCustomer()
{
    var customer = connect.QueryFirst<Customer>("select 1 active from dual"); // this works
    connect.Execute("insert into customers(active) values(:active)", customer); // this doesn't
}

Pero esto arroja una excepción:

System.ArgumentException: 'El valor no está dentro del rango esperado'.

Sé que puedo crear otra propiedad public int ActiveInt => Active ? 1 : 2; pero me gustaría mantener mis clases de POCO lo más limpias posible, especialmente porque las propiedades deben ser públicas para que Dapper las use como parámetros.

Intenté crear un controlador de tipo bool, pero solo funciona para columnas de consulta, no para parámetros: https://github.com/StackExchange/Dapper/issues/303

También necesito pasar el objeto completo como parámetro, por lo que no es posible convertirlo al pasar el parámetro.

¿Hay una manera de hacer eso?

Respuesta popular

No tengo una base de datos Oracle para jugar, sin embargo, con lo que veo en línea y lo que sé de Dapper, puedes intentar convertir tu objeto en un objeto de parámetros dinámicos apuesto e insertar el: eso es requerido por Oracle en el frente de cada nombre de parámetro. Puedes hacer eso usando este método de extensión que preparo:

public static class ParameterExtensions
  {
    /// <summary>
    /// Extension method that converts any single dimensional object into Dapper's Dynamic Parameters
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="incoming"></param>
    /// <param name="allowNulls">Provide true to allow nulls to be mapped</param>
    /// <returns></returns>
    public static DynamicParameters ConvertToDynamicParameters<T>(this T incoming, bool allowNulls = false)
    {
      DynamicParameters dynamicParameters = new DynamicParameters();
      foreach (PropertyInfo property in incoming.GetType().GetProperties())
      {
        object value = GetPropValue(incoming, property.Name);
        if (value != null || allowNulls) dynamicParameters.Add($":{property.Name}", value);
      }
      return dynamicParameters;
    }

    private static object GetPropValue(object src, string propName)
    {
      return src.GetType().GetProperty(propName)?.GetValue(src, null);
    }
  }

Esto es a lo que su implementación cambiaría:

public class Customer
{
  public bool Active { get; set; }
}
static void InsertCustomer()
{
  var customer = connect.QueryFirst<Customer>("select 1 active from dual"); // this works
  connect.Execute(@"insert into customers(active) values(:active)", customer.ConvertToDynamicParameters()); // this doesn't
}

Por favor, avíseme si esto funcionó para usted.

** Nota: Necesitará hacer que los parámetros coincidan con mayúsculas y minúsculas en la consulta y en su objeto. Por ejemplo, en su objeto Cliente tiene Cliente. Activo este nombre debe coincidir: activo.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué