2017-02-21 54 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。