使用通C#布尔作为参数传递给甲骨文小巧玲珑
问题描述:
我试图用小巧玲珑来传递一个布尔值作为参数传递给甲骨文,翻译成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
我还需要通过整个对象作为参数,传递参数时,所以转换是不可能的。
有没有办法做到这一点?
答
我没有一个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。