문제

내가 사용하여 nhibernate 를 저장하는 일부 사용자 설정에서 앱에 대한 SQL Server Compact Edition 테이블.

이것은 발췌를 매핑 file:

<property name="Name" type="string" />
<property name="Value" type="string" />

이름은 일반 문자열/이며(50),그리고 값으로 설정원에서 DB

를 쓰려고 노력해요 큰 금액 xml 가치"를"제공합니다.나는 예외가 모든 시간:

@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>

그 한 예입니다.다른 구성에는 다음이 포함됩니다"원"대신에"StringClob".그는 구성을 던지지 않는 예외를 매핑은 여전히 던져 문자열이 잘 예외는 아니다.

은 이 문제를("기능")SQL CE?가 4000characters 으로 SQL CE 데이터베이스로 nhibernate?그렇다면,누구나 어떻게 말해?

많은 감사!

도움이 되었습니까?

해결책

좋아요,많은 감사와 함께하는 아르투르에서 이 스레드, 여기의 솔루션:에서 상속 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;
            }

        }
    }
}

그런 다음,이 드라이버를 사용하는 대신 NHibernate 의습니다.config

<nhibernateDriver>MySqlServerCeDriverNamespace.MySqlServerCeDriver , MySqlServerCeDriverNamespace</nhibernateDriver>

나는 많이 보았의 다른 글 사람들이 이 문제가 있었고,그것을 해결해 변화하는 sql-type 속성을"StringClob"-으로 시도한 이 스레드가 있습니다.

는 이유를 모르겠어요 그것은 작동하지 않을 것이지만,저는 그것을 의심하는 사실 나는 SQL 을 사용하여 세륨 그리고 일부는 다른 DB.하지만,당신이 있습니다!

다른 팁

<property name="Value" type="string" />
  <column name="Value" sql-type="StringClob" />
</property>

나는 가정이 오므로 폐쇄 속성 태그에 두 번.그냥을 가리키는 이것을 경우에는 것이지만 오타.

<property name="Value" type="string" length="4001" />

했:

<property name="Value" type="string" length="4001" />

<property name="Value" type="string" >
  <column name="Value" sql-type="StringClob" length="5000"/>
</property>

도 일했다,나는...동일한 예외가-그것은 여전히는 최대 값은 4000.

왜 당신은 당신을 사용하여 하위 요소 구?

try:

<property name='Value' type='StringClob' />

현 deplyoment 의 SQL CE 고 NHibernate 내용의 길이 4001.다음 NHibernate 생성 재료로견 대신 이며.

도니다.

다른 것을 사용하 NHibernate 및 SQL CE:

<session-factory>
  ...
  <property name="connection.release_mode">on_close</property>
</session-factory>

를 해결하는 몇 가지 다른 문제는 나를 위해야.

후 읽기 당신의 게시물이 수정하고 작동하는 그것에 내 코드

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;
        }

    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top