我正在使用nhibernate为SQL Server Compact Edition表中的应用程序存储一些用户设置。
这是地图文件的摘录:
<property name="Name" type="string" />
<property name="Value" type="string" />
名称是常规字符串/ nvarchar(50),并且值在数据库中设置为ntext
我正在尝试将大量xml写入“Value”属性。我每次都会得到一个例外:
@p1 : String truncation: max=4000, len=35287, value='<lots of xml..../>'
我已经搜索了很多,并尝试了许多不同的映射配置:
<property name="Name" type="string" />
<property name="Value" type="string" >
<column name="Value" sql-type="StringClob" />
</property>
这是一个例子。其他配置包括“ntext”而不是“StringClob”。那些不抛出映射异常的配置仍会抛出字符串截断异常。
这是SQL CE的问题(“功能”)吗?是否可以使用nhibernate将超过4000个字符放入SQL CE数据库?如果是这样,谁能告诉我怎么样?
非常感谢!
答案 0 :(得分:6)
好的,非常感谢this thread中的Artur,这是解决方案: 使用新的SqlServerCeDriver继承,并覆盖InitializeParamter方法:
using System.Data;
using System.Data.SqlServerCe;
using NHibernate.Driver;
using NHibernate.SqlTypes;
namespace MySqlServerCeDriverNamespace
{
/// <summary>
/// Overridden Nhibernate SQL CE Driver,
/// so that ntext fields are not truncated at 4000 characters
/// </summary>
public class MySqlServerCeDriver : SqlServerCeDriver
{
protected override void InitializeParameter(
IDbDataParameter dbParam,
string name,
SqlType sqlType)
{
base.InitializeParameter(dbParam, name, sqlType);
if (sqlType is StringClobSqlType)
{
var parameter = (SqlCeParameter)dbParam;
parameter.SqlDbType = SqlDbType.NText;
}
}
}
}
然后,在app.config
中使用此驱动程序代替NHibernate<nhibernateDriver>MySqlServerCeDriverNamespace.MySqlServerCeDriver , MySqlServerCeDriverNamespace</nhibernateDriver>
我看到很多其他人发布此问题的帖子,并通过将sql-type属性更改为“StringClob”解决了这个问题 - 就像在此主题中尝试的那样。
我不确定为什么它对我不起作用,但我怀疑这是因为我使用的是SQL CE而不是其他数据库。但是,你有它!
答案 1 :(得分:0)
<property name="Value" type="string" />
<column name="Value" sql-type="StringClob" />
</property>
我假设这是一个小错字,因为你已经关闭了属性标签两次。只是指出这一点,万一它不是一个错字。
答案 2 :(得分:0)
尝试<property name="Value" type="string" length="4001" />
答案 3 :(得分:0)
尝试:
<property name="Value" type="string" length="4001" />
和
<property name="Value" type="string" >
<column name="Value" sql-type="StringClob" length="5000"/>
</property>
两者都没有用,我担心......同样的例外 - 它仍然说最大值是4000。
答案 4 :(得分:0)
为什么使用子元素语法?
尝试:
<property name='Value' type='StringClob' />
答案 5 :(得分:0)
在我目前的SQL CE和NHibernate的deplyoment上,我使用长度为4001.然后NHibernate生成NTEXT而不是NVARCHAR。
试试。
与NHibernate和SQL CE一起使用的另一件事是:
<session-factory>
...
<property name="connection.release_mode">on_close</property>
</session-factory>
至少为我解决了一些其他问题。
答案 6 :(得分:0)
阅读完您的帖子后,这个修改让我的代码
protected override void InitializeParameter(IDbDataParameter dbParam,string name,SqlType sqlType)
{
base.InitializeParameter(dbParam, name, sqlType);
var stringType = sqlType as StringSqlType;
if (stringType != null && stringType.LengthDefined && stringType.Length > 4000)
{
var parameter = (SqlCeParameter)dbParam;
parameter.SqlDbType = SqlDbType.NText;
}
}