我尝试使用 Dapper 将 bool 作为参数传递给 Oracle,转换为数据库上的 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
}
但这会引发异常:
System.ArgumentException:'值未落在预期范围内
范围。'
我知道我可以创建另一个财产public int ActiveInt => Active ? 1 : 2;
但我希望保持 POCO 类尽可能干净,特别是因为 Dapper 需要将属性公开才能将它们用作参数。
我尝试创建一个 bool 类型处理程序,但它仅适用于查询列,不适用于参数:https://github.com/StackExchange/Dapper/issues/303 https://github.com/StackExchange/Dapper/issues/303
我还需要将整个对象作为参数传递,因此在传递参数时无法进行转换。
有没有办法做到这一点?
我使用 Dapper.SqlMapper.AddTypeMap(Type, DbType) 方法。
public class Customer
{
public bool Active { get; set; }
}
class Program : IDisposable
{
private readonly DbConnection _connection;
public Program()
{
_connection = DbOpen();
}
static void Main(string[] args)
{
SqlMapper.AddTypeMap(typeof(bool), DbType.Int32);
using (var program = new Program())
{
program.Run();
}
}
private void Run()
{
_connection.Execute($"INSERT INTO customers ( active ) VALUES (:Activate)", new { Activate = true });
_connection.Execute($"INSERT INTO customers ( active ) VALUES (:Activate)", new { Activate = false });
var customers = new List<Customer>()
{
new Customer() {Active = true},
new Customer() {Active = false}
};
_connection.Execute($"INSERT INTO customers ( active ) VALUES (:{nameof(Customer.Active)})", customers);
var results = _connection.Query<Customer>("SELECT * FROM customers");
foreach (var customer results)
{
Console.WriteLine($"{nameof(Customer.Active)} is {customer.Active}");
}
}
private static DbConnection DbOpen()
{
var connectionSetting = ConfigurationManager.ConnectionStrings["oracle"];
var dbFactory = DbProviderFactories.GetFactory(connectionSetting.ProviderName);
var conn = dbFactory.CreateConnection();
conn.ConnectionString = connectionSetting.ConnectionString;
conn.Open();
return conn;
}
public void Dispose()
{
_connection?.Dispose();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)