Dapper를 사용하여 C # bool을 매개 변수로 Oracle에 전달합니다.

c# dapper oracle

문제

Dapper를 사용하여 bool을 매개 변수로 전달하려고합니다. 다음과 같이 데이터베이스의 1/0 필드로 변환합니다.

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
}

그러나 이것은 예외를 throw합니다.

System.ArgumentException : '값이 예상 된 범위 내에 있지 않습니다.'

나는 다른 속성을 만들 수 있다는 것을 알고있다 public int ActiveInt => Active ? 1 : 2; 가능한 한 깨끗한 POCO 클래스를 유지하고 싶습니다. 특히 Dapper가 속성을 매개 변수로 사용하려면 public 속성이 필요합니다.

bool 유형 처리기를 만들려고했지만 매개 변수가 아닌 쿼리 열에 대해서만 작동합니다. https://github.com/StackExchange/Dapper/issues/303

전체 개체를 매개 변수로 전달해야하므로 매개 변수를 전달할 때 변환이 불가능합니다.

그렇게 할 수있는 방법이 있습니까?

인기 답변

그러나 오라클 DB를 가지고 놀고 싶지는 않습니다. 온라인에서 볼 수있는 것과 내가 알고있는 것, 당신은 당신의 객체를보다 동적 인 매개 변수 객체로 변환하여 삽입 할 수 있습니다. 각 매개 변수 이름. 당신은 내가 함께 넣어이 확장 방법을 사용하여 할 수 있습니다 :

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);
    }
  }

구현이 다음과 같이 변경됩니다.

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
}

이 방법이 효과가 있는지 알려주세요.

** 참고 : 쿼리와 개체에서 대문자와 일치하는 매개 변수를 만들어야합니다. 예를 들어 Customer 객체에 Customer.Active가 있으면이 이름은 active와 일치해야합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.