gpt4 book ai didi

NHibernate nvarchar/ntext 截断问题

转载 作者:行者123 更新时间:2023-12-05 00:44:21 26 4
gpt4 key购买 nike

我正在使用 nhibernate 在 SQL Server Compact Edition 表中存储应用程序的一些用户设置。

这是映射文件的摘录:

<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 的问题(“功能”)吗?是否可以使用 nhibernate 将超过 4000 个字符放入 SQL CE 数据库中?如果是这样,谁能告诉我怎么做?

非常感谢!

最佳答案

好的,非常感谢 Artur 在 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;
}

}
}
}

然后,在 app.config 中使用此驱动程序而不是 NHibernate
<nhibernateDriver>MySqlServerCeDriverNamespace.MySqlServerCeDriver , MySqlServerCeDriverNamespace</nhibernateDriver>

我看到很多其他人有这个问题的帖子,并通过将 sql-type 属性更改为“StringClob”来解决它 - 正如在这个线程中所尝试的那样。

我不确定为什么它对我不起作用,但我怀疑这是因为我使用的是 SQL CE 而不是其他一些数据库。但是你现在有了!

关于NHibernate nvarchar/ntext 截断问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/120470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com