命名参数问题的解决原来是因为 Oracle 命令要求将 BindByName 属性设置为 true。要解决这个问题,需要对 SqlMapper 本身进行调整。这有点讨厌,因为调整不是可移植的(它依赖于特定 Oracle 命令的类型检查),但它目前可以满足我们的需求。更改涉及更新 SetupCommand 方法,在从连接对象创建命令后,我们键入检查并设置标志,如下所示(~ln 635):
var cmd = cnn.CreateCommand();
if (cmd is OracleCommand)
{
((OracleCommand)cmd).BindByName = true; // Oracle Command Only
}
最后,要解决参数名称中“@”到“:”的问题,涉及更改 CreateParamInfoGenerator 方法。我添加了一个静态字符串 - DefaultParameterCharacter 将其值设置为“:”,然后将 ln 530 修改为:
il.Emit(OpCodes.Ldstr, "@" + prop.Name); // stack is now [parameters] [c
到
il.Emit(OpCodes.Ldstr, DefaultParameterCharacter + prop.Name); // stack is now [parameters] [command] [name] (Changed @ to : for oracle)
和 ln 546 来自:
il.Emit(OpCodes.Ldstr, "@" + prop.Name); // stack is now [parameters] [parameters] [parameter] [parameter] [name] (Changed @ to : for oracle)
到:
il.Emit(OpCodes.Ldstr, DefaultParameterCharacter + prop.Name); // stack is now [parameters] [parameters] [parameter] [parameter] [name] (Changed @ to : for oracle)
这使得 Dapper 可以完美地使用 Oracle 命令