有没有办法将Dapper与存储过程返回的Oracle用户定义类型一起使用? Dapper似乎适用于存储过程(参见Using Dapper with Oracle stored procedures which return cursors)。
var p = new OracleDynamicParameters();
p.Add("param_list", null, OracleDbType.Object, ParameterDirection.Output);
p.Add("param_reco", null, OracleDbType.Object, ParameterDirection.Output);
在我的示例中,我添加了一个UDT集合对象作为输出参数(param_list
)。
我正在使用Dapper – Micro ORM for Oracle and Microsoft .NET中发布的自定义OracleDynamicParameters
。
我越是阅读与ORM相关的东西,我就越看到Oracle UDT对象成为障碍。 在这种情况下,普通的ADO.NET和生成的C#实体类似乎是唯一的出路。 也许automapper.org可能对将域对象映射到UDT对象很有用。
答案 0 :(得分:2)
查看使用OracleCustomTypeMapping属性和OracleObjectMapping属性。不记得我从哪里得到这个想法,但......
public interface INullableOracleCustomType: INullable, IOracleCustomType
{
}
[OracleCustomTypeMapping("<YOUR_SCHEMA_NAME>.<UDT_OBJECT_NAME>")]
public class ParameterObject : INullableOracleCustomType
{
private bool objectIsNull;
#region constructor
public ParameterObject()
{ }
public ParameterObject(string parameterName, string parameterValue)
{
this.ParameterName = parameterName;
this.ParameterValue = parameterValue;
}
#endregion
#region properties
[OracleObjectMappingAttribute("PARAMETERNAME")]
public string ParameterName { get; set; }
[OracleObjectMappingAttribute("PARAMETERVALUE")]
public string ParameterValue { get; set; }
public static ParameterObject Null
{
get
{
ParameterObject parameterObject = new ParameterObject();
parameterObject.objectIsNull = true;
return parameterObject;
}
}
#endregion
#region INullable Members
public bool IsNull
{
get { return objectIsNull; }
}
#endregion
#region IOracleCustomType
public void FromCustomObject(Oracle.DataAccess.Client.OracleConnection con, IntPtr pUdt)
{
// Convert from the Custom Type to Oracle Object
if (!string.IsNullOrEmpty(ParameterName))
{
OracleUdt.SetValue(con, pUdt, "PARAMETERNAME", ParameterName);
}
if (!string.IsNullOrEmpty(ParameterValue))
{
OracleUdt.SetValue(con, pUdt, "PARAMETERVALUE", ParameterValue);
}
}
public void ToCustomObject(Oracle.DataAccess.Client.OracleConnection con, IntPtr pUdt)
{
ParameterName = (string)OracleUdt.GetValue(con, pUdt, "PARAMETERNAME");
ParameterValue = (string)OracleUdt.GetValue(con, pUdt, "PARAMETERVALUE");
}
#endregion
}
示例用法...
public static OracleParameter CreateCustomTypeArrayInputParameter<T>(string name, string oracleUDTName, T value)
where T : INullableOracleCustomType
{
OracleParameter parameter = new OracleParameter();
parameter.ParameterName = name;
parameter.OracleDbType = OracleDbType.Array;
parameter.Direction = ParameterDirection.Input;
parameter.UdtTypeName = oracleUDTName;
parameter.Value = value;
return parameter;
}
Oracle似乎对ALLCAPS中的架构/类型/对象名称很挑剔