2017-02-21 73 views
0

我试图用小巧玲珑来传递一个布尔值作为参数传递给甲骨文,翻译成1/0场的数据库上,像这样:使用通C#布尔作为参数传递给甲骨文小巧玲珑

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类尽可能干净,特别是因为性需要是公众小巧玲珑使用它们作为参数。

我试图创建一个布尔类型的处理程序,但它仅适用于查询栏,没有参数:https://github.com/StackExchange/Dapper/issues/303

我还需要通过整个对象作为参数,传递参数时,所以转换是不可能的。

有没有办法做到这一点?

回答

0

我没有一个Oracle数据库可以使用,但是,通过我在线看到的以及我所知道的小巧工具,可以尝试将您的对象转换为精巧的动态参数对象并插入:这是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。