Frage

Ich verwende nhibernate, um zu speichern einige Benutzer die Einstellungen für eine app in einer SQL Server Compact Edition-Tabelle.

Dies ist ein Auszug der mapping-Datei:

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

Der Name ist eine regelmäßige string nvarchar(50), und die Wert ist set als ntext in der DB

Ich bin versucht zu schreiben, eine große Menge von xml, um die Eigenschaft "Value".Ich bekomme eine Ausnahme jedes mal:

@p1 : String truncation: max=4000, len=35287, value='<lots of xml..../>'

Ich habe gegoogelt es durchaus ein wenig, und versucht, eine Reihe von verschiedenen mapping-Konfigurationen:

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

Das ist ein Beispiel.Andere Konfigurationen umfassen "ntext" statt "StringClob".Diese Konfigurationen, die nicht werfen mapping Ausnahmen immer noch werfen die Zeichenfolge abgeschnitten Ausnahme.

Ist das ein problem ("feature") mit SQL CE?Ist es möglich, mehr als 4000 Zeichen in einer SQL CE-Datenbank mit nhibernate?Wenn ja, kann mir jemand sagen wie?

Vielen Dank!

War es hilfreich?

Lösung

Okay, vielen Dank an Artur in dieser thread, hier ist die Lösung:Erben von der SqlServerCeDriver mit eine neue ein, und überschreiben Sie die InitializeParamter Methode:

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

        }
    }
}

Dann verwenden Sie diesen Treiber anstelle von NHibernate in Ihrer app.config

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

Ich sah eine Menge anderer Beiträge, wo Leute hatte dieses problem und löste es, indem nur die änderung der sql-Typ-Attribut auf "StringClob" - so versucht in diesem thread.

Ich bin mir nicht sicher, warum es würde nicht für mich arbeiten, aber ich vermute, es ist die Tatsache, dass ich mit SQL CE und nicht eine andere DB.Aber, da haben Sie es!

Andere Tipps

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

Ich gehe davon aus das ist ein kleiner Tippfehler, da Sie geschlossen haben, die Eigenschaft tag zweimal.Nur den Hinweis, in Fall es war kein Tippfehler.

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

Versucht:

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

und

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

Weder arbeitete, fürchte ich...Dieselbe Ausnahme - er sagt immer noch, dass der max-Wert ist 4000.

Warum verwenden Sie das sub-element-syntax?

versuchen:

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

Auf meinem aktuellen deplyoment von SQL CE und NHibernate verwende ich eine Länge von 4001.Dann NHibernate erzeugt, das Zeug als NTEXT anstelle von NVARCHAR.

Versuchen Sie, die.

Eine andere Sache, zu verwenden mit NHibernate sowie SQL CE:

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

Das löst einige Probleme für mich atleast.

Nach der Lektüre Ihrer post diese änderung habe es funktioniert in meinem code

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

    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top