2008-09-23 4 views
4

Я использую nhibernate для хранения некоторых пользовательских настроек для приложения в таблице SQL Server Compact Edition.NHbernate nvarchar/ntext проблема усечения

Это отрывок файл отображения:

<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? Возможно ли разместить более 4000 символов в базе данных SQL CE с помощью nhibernate? Если да, может ли кто-нибудь сказать мне, как?

Большое спасибо!

ответ

6

Хорошо, спасибо Артуру в this thread, вот решение: Наследовать от 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 находится в вашем app.config

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

Я видел много других сообщений где люди столкнулись с этой проблемой, и решили ее, просто изменив атрибут sql-type на «StringClob» - как пытались в этом потоке.

Я не уверен, почему это не сработает для меня, но я подозреваю, что я использую SQL CE, а не какую-то другую БД. Но, вот оно!

+0

Почему я не могу принять мой собственный пост ответа? Это действительно решило проблему, в конце концов ... – Reiste 2008-09-25 09:09:27

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

Я предполагаю, что это небольшая опечатка, так как вы дважды закрыли тег свойства. Просто указывая на это, на случай, если это не опечатка.

0

Попробуйте <property name="Value" type="string" length="4001" />

0

Пробовал:

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

и

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

Ни работал, я боюсь ... То же исключение - она ​​по-прежнему говорит, что максимальное значение равно 4000.

0

Почему вы используете синтаксис подэлемента?

попробовать:

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

На моем текущем deplyoment из SQL CE и NHibernate я использую длину 4001.Затем NHibernate генерирует материал как NTEXT вместо NVARCHAR.

Попробуйте это.

Другое дело использовать с NHibernate и SQL CE является:

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

Это решает некоторые другие проблемы, для меня по крайней мере.

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

    } 
Смежные вопросы