我正在寻找从 XDocument 属性类型映射到 Oracle XMLType 的最佳方式?我正在映射到旧数据库并且无法控制架构。它是甲骨文 9i。
我已经读过 nHibernate 的第 3 版为这种类型的映射提供了开箱即用的功能。我正在使用具有流畅映射的 3.1 版,并且在创建时使用默认映射时收到以下错误:
System.ArgumentOutOfRangeException :指定的参数超出了有效值的范围。在 Oracle.DataAccess.Client.OracleParameter.set_DbType(DbType 值) 在 NHibernate.Driver.DriverBase.SetCommandParameters(IDbCommand cmd, SqlType[] sqlTypes) 在 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Driver\DriverBase .cs: NHibernate.Driver.DriverBase.GenerateCommand(CommandType type, SqlString sqlString, SqlType[] parameterTypes) 在 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Driver\DriverBase.cs 的第 180 行:第 136 行NHibernate.AdoNet.AbstractBatcher.Generate(CommandType type, SqlString sqlString, SqlType[] parameterTypes) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\AdoNet\AbstractBatcher.cs:NHibernate.AdoNet.AbstractBatcher 的第 78 行。 PrepareBatchCommand(CommandType type, SqlString sql, SqlType[] parameterTypes) in d:
我解决了这个问题,我编写了我自己的用户类型,它在 XDocument 和字符串之间转换:
public SqlType[] SqlTypes
{
get { return (new SqlType[] { new StringClobSqlType() }); }
}
public Type ReturnedType
{
get { return (typeof(XDocument)); }
}
public object NullSafeGet(IDataReader rs, string[] names, object owner)
{
XDocument xDoc = null;
int columnIndex = rs.GetOrdinal(names[0]);
if (!rs.IsDBNull(columnIndex))
{
xDoc = XDocument.Parse((rs[columnIndex].ToString()));
}
return (xDoc);
}
public void NullSafeSet(IDbCommand cmd, object value, int index)
{
IDbDataParameter parameter = (IDbDataParameter)cmd.Parameters[index];
if (value == null)
{
parameter.Value = DBNull.Value;
}
else
{
XDocument xDoc = (XDocument)value;
parameter.Value = xDoc.ConvertToString();
}
}
这工作正常,直到字符串长度大于 4000 个字符。现在我得到错误:
NHibernate.Exceptions.GenericADOException:无法插入:[XmlBlob#95586][SQL: INSERT INTO XMLBLOB (CAT_CODE, BLB_BLOB, BLB_ID) VALUES (?, ?, ?)] ----> Oracle.DataAccess.Client.OracleException: ORA-01461: 只能绑定 LONG 值以插入 LONG 列