我们有一个带有varchar和nvarchar max列的SQL Server表,如下所示:
CREATE TABLE [dbo].[MyTable](
:
[MyBigUnicodeColumn] [nvarchar](max) NULL,
[MyBigAnsiColumn] [varchar](max) NULL,
:
创建映射(hbm.xml)文件时,documentation表示将StringClob用作数据库类型为DbType.String的大型对象的类型属性,但没有说明如果数据库类型为DbType怎么办.AnsiString。
<class name="MyTable" table="MyTable" lazy="false">
:
<property name="MyBigUnicodeColumn" type="StringClob" />
<property name="MyBigAnsiColumn" type="????" />
:
这适用于NHibernate 3.3.1。
最佳答案
您可以将它们映射为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代码,发现以下内容:
从SQL Server 2005开始,方言支持varchar(max)。
MsSql2000Dialect.cs,第205行
RegisterColumnType(DbType.AnsiString, SqlClientDriver.MaxSizeForLengthLimitedAnsiString, "VARCHAR($l)");
MsSql2005Dialect.cs,第19行:
RegisterColumnType(DbType.AnsiString, SqlClientDriver.MaxSizeForAnsiClob, "VARCHAR(MAX)");
当AnsiString映射到大于8000时,它将varchar(max)注册为要选择的sql类型。
在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;
它始终将8000作为AnsiString类型的参数的限制。
由于驱动程序和方言之间的不一致,我将其称为错误。
由于该错误发生在所有AnsiString上,因此在映射中指定sql类型无济于事(NH能够选择正确的sql类型)。您需要使用thread you started on the NH forum中建议的解决方法:
<property name="MyBigAnsiColumn" type="StringClob" sql-type="VARCHAR(max)" />
我将其报告为错误:https://nhibernate.jira.com/browse/NH-3252
关于nhibernate - 如何在NHibernate hbm.xml映射文件中映射VARCHAR(MAX)列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12105929/