当前位置:  开发笔记 > 编程语言 > 正文

NHibernate nvarchar/ntext截断问题

如何解决《NHibernatenvarchar/ntext截断问题》经验,为你挑选了1个好方法。

我正在使用nhibernate为SQL Server Compact Edition表中的应用程序存储一些用户设置.

这是映射文件的摘录:



Name是常规字符串/ nvarchar(50),Value在DB中设置为ntext

我正在尝试将大量xml写入"Value"属性.我每次都得到一个例外:

@p1 : String truncation: max=4000, len=35287, value=''

我用Google搜索了一下,并尝试了许多不同的映射配置:



  

这是一个例子.其他配置包括"ntext"而不是"StringClob".那些不抛出映射异常的配置仍会抛出字符串截断异常.

这是SQL CE的问题("功能")吗?是否可以使用nhibernate将超过4000个字符放入SQL CE数据库?如果是这样,谁能告诉我怎么样?

非常感谢!



1> Reiste..:

好的,非常感谢Artur在这个帖子中,这是解决方案:从SqlServerCeDriver继承一个新的,并覆盖InitializeParamter方法:

using System.Data;
using System.Data.SqlServerCe;
using NHibernate.Driver;
using NHibernate.SqlTypes;

namespace MySqlServerCeDriverNamespace
{
    /// 
    /// Overridden Nhibernate SQL CE Driver,
    /// so that ntext fields are not truncated at 4000 characters
    /// 
    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

MySqlServerCeDriverNamespace.MySqlServerCeDriver , MySqlServerCeDriverNamespace

我看到很多其他帖子,人们有这个问题,并通过将sql-type属性更改为"StringClob"来解决它 - 正如在此线程中尝试的那样.

我不确定为什么它对我不起作用,但我怀疑这是因为我使用的是SQL CE而不是其他数据库.但是你现在有了!

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有