4

nhibernate を使用して、アプリのユーザー設定を SQL Server Compact Edition テーブルに保存しています。

これはマッピング ファイルの抜粋です。

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

名前は通常の文字列/nvarchar(50) で、値は DB で ntext として設定されます

「Value」プロパティに大量の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」の代わりに「ntext」が含まれます。マッピング例外をスローしない構成でも、文字列切り捨て例外がスローされます。

これは SQL CE の問題 (「機能」) ですか? nhibernate を使用して SQL CE データベースに 4000 文字を超える文字を入れることは可能ですか? もしそうなら、誰か教えてもらえますか?

どうもありがとう!

4

7 に答える 7

6

さて、このスレッドの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;
            }

        }
    }
}

次に、app.configでNHibernateの代わりにこのドライバーを使用します

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

このスレッドで試みられたように、人々がこの問題を抱えている他の多くの投稿を見て、sql-type属性を「StringClob」に変更するだけで問題を解決しました。

なぜうまくいかないのかはわかりませんが、他のDBではなくSQLCEを使用していることが原因だと思います。しかし、あなたはそれを持っています!

于 2008-09-25T09:04:22.873 に答える
0

SQL CEとNHibernateの現在の展開では、長さ4001を使用します。次に、NHibernateはNVARCHARではなくNTEXTとしてデータを生成します。

それを試してみてください。

NHibernateおよびSQLCEで使用するもう1つのものは次のとおりです。

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

それは少なくとも私にとって他のいくつかの問題を解決します。

于 2009-04-07T08:53:39.277 に答える
0

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

于 2008-09-23T12:42:14.240 に答える
0

なぜサブ要素構文を使用しているのですか?

試す:

<property name='Value' type='StringClob' />
于 2008-10-18T01:02:45.530 に答える
0
<property name="Value" type="string" />
  <column name="Value" sql-type="StringClob" />
</property>

プロパティ タグを 2 回閉じているため、これは小さなタイプミスだと思います。タイプミスでない場合に備えて、これを指摘するだけです。

于 2008-09-23T12:05:43.657 に答える
0

試した:

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

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

どちらも機能しませんでした...同じ例外-最大値は4000であると言われています。

于 2008-09-23T13:13:49.843 に答える
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;
        }

    }
于 2011-09-01T13:23:06.217 に答える