string
またはのようにマッピングできますAnsiString
。
<property name="MyBigUnicodeColumn" type="string" length="1000000"/>
<property name="MyBigAnsiColumn" type="AnsiString" length="1000000" />
長さがそれぞれ 4000 または 8000 より大きい場合、NH は nvarchar(max) または varchar(max) を作成します。
長さがSQLパラメーターに使用され、指定された長さに切り捨てられている可能性があります(使用しているNHバージョンによって異なりますが、いくつかの変更がありました)。したがって、十分な大きさを指定することをお勧めします。
編集: 残念ながら、通常の文字列と同じように AnsiString では機能しません。NHコードを読んだところ、次のことがわかりました。
varchar(max) は、SQL Server 2005 以降の方言でサポートされています。
MsSql2000Dialect.cs、205 行目
RegisterColumnType(DbType.AnsiString, SqlClientDriver.MaxSizeForLengthLimitedAnsiString, "VARCHAR($l)");
MsSql2005Dialect.cs、19 行目:
RegisterColumnType(DbType.AnsiString, SqlClientDriver.MaxSizeForAnsiClob, "VARCHAR(MAX)");
AnsiString が 8000 を超えてマップされた場合に選択する sql 型として varchar(max) を登録します。
SqlClientDriver.cs では、文字列の params に "blob" が実装されていますが、ansi 文字列には実装されていないことがわかります (135 行目)。
case DbType.AnsiString:
case DbType.AnsiStringFixedLength:
dbParam.Size = MaxSizeForLengthLimitedAnsiString;
break;
// later on
case DbType.String:
case DbType.StringFixedLength:
dbParam.Size = IsText(dbParam, sqlType) ? MaxSizeForClob : MaxSizeForLengthLimitedString;
break;
AnsiString 型のパラメータの制限は常に 8000 です。
ドライバーと方言の不一致のため、私はこれをバグと呼んでいます。
このバグはすべての AnsiString で発生するため、マッピングで sql-type を指定しても役に立ちません (NH は正しい sql 型を選択できます)。NH フォーラムで開始したスレッドで提案されている回避策を使用する必要があります。
<property name="MyBigAnsiColumn" type="StringClob" sql-type="VARCHAR(max)" />
バグとして報告しました: https://nhibernate.jira.com/browse/NH-3252