Rei*_*ste 4 nhibernate truncate ntext sql-server-ce
我正在使用nhibernate为SQL Server Compact Edition表中的应用程序存储一些用户设置.
这是映射文件的摘录:
<property name="Name" type="string" />
<property name="Value" type="string" />
Run Code Online (Sandbox Code Playgroud)
Name是常规字符串/ nvarchar(50),Value在DB中设置为ntext
我正在尝试将大量xml写入"Value"属性.我每次都得到一个例外:
@p1 : String truncation: max=4000, len=35287, value='<lots of xml..../>'
Run Code Online (Sandbox Code Playgroud)
我用Google搜索了一下,并尝试了许多不同的映射配置:
<property name="Name" type="string" />
<property name="Value" type="string" >
<column name="Value" sql-type="StringClob" />
</property>
Run Code Online (Sandbox Code Playgroud)
这是一个例子.其他配置包括"ntext"而不是"StringClob".那些不抛出映射异常的配置仍会抛出字符串截断异常.
这是SQL CE的问题("功能")吗?是否可以使用nhibernate将超过4000个字符放入SQL CE数据库?如果是这样,谁能告诉我怎么样?
非常感谢!
好的,非常感谢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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,在app.config中使用此驱动程序而不是NHibernate
<nhibernateDriver>MySqlServerCeDriverNamespace.MySqlServerCeDriver , MySqlServerCeDriverNamespace</nhibernateDriver>
Run Code Online (Sandbox Code Playgroud)
我看到很多其他帖子,人们有这个问题,并通过将sql-type属性更改为"StringClob"来解决它 - 正如在此线程中尝试的那样.
我不确定为什么它对我不起作用,但我怀疑这是因为我使用的是SQL CE而不是其他数据库.但是你现在有了!
| 归档时间: |
|
| 查看次数: |
6467 次 |
| 最近记录: |