2017-02-21 7 views
0

Я пытаюсь передать логическое значение в качестве параметра Oracle с помощью Щеголеватого, переводя на 1/0 поле в базе данных, например:Pass C# BOOL в качестве параметра в Oracle с помощью Щеголеватого

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 
} 

Но это порождает исключение:

System.ArgumentException: «Значение не входит в ожидаемый диапазон ».

Я знаю, что могу создать еще одно свойство public int ActiveInt => Active ? 1 : 2;, но я хотел бы, чтобы мои классы POCO как можно более чистым, особенно потому, что свойства должны быть открытыми для Щеголеватый, чтобы использовать их в качестве параметров.

Я попытался создать обработчик типа BOOL, но он работает только для столбцов запроса, а не параметры: https://github.com/StackExchange/Dapper/issues/303

мне нужно передать весь объект в качестве параметра, поэтому преобразования при переходе параметра не представляется возможным ,

Есть ли способ сделать это?

ответ

0

У меня нет Oracle DB, чтобы играть с тем, что я вижу в Интернете, и что я знаю о dapper, вы можете попробовать преобразовать свой объект в объект динамических параметров dapper и вставить: то, что требуется oracle в начало каждого имени параметра. Вы можете сделать это с помощью этого метода расширения я поставил вместе:

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.

Смежные вопросы