【问题标题】:NTEXT with more than 4000 characters in SQL Server CE in Windows PhoneWindows Phone 中 SQL Server CE 中超过 4000 个字符的 NTEXT
【发布时间】:2012-07-06 15:27:27
【问题描述】:

windows phone中SQL Server CE中超过4000个字符的NTEXT

我的 Windows Phone 应用程序中有一个数据库,其中一个表中有一个 ntext 字段,我正在尝试向该字段写入一些内容,但我收到一个带有消息的 InvalidOperationException

字符串截断:max=4000, len=4621

我正在尝试使用 ntext,因为我知道 nvarchar 不接受超过 4000 个字符。

我已经搜索了解决方案,但找不到任何解决方案。

我发现我无法在 windows phone 上使用的唯一解决方案,因为它使用 SqlConnectionSqlCommandSqlDbType

以下是列的声明方式:

    private string _content;
    [Column(DbType="ntext")]
    public string Content
    {
        get
        {
            return _content;
        }
        set
        {
            if (value != _content)
            {
                _content = value;
                NotifyChange(o => o.Content);
            }
        }
    }

我将其插入:

cn.Articles.InsertAllOnSubmit(articlesToSave); 
cn.SubmitChanges();

有人知道解决方法吗?

提前感谢您的回答!

【问题讨论】:

  • CE不支持nvarchar(max)吗?如果是这样,那是比ntext 更好的选择。
  • 不,不支持,至少windows phone不支持,它只接受nvarchar(4000)作为最大长度。
  • 那么我怀疑它也会在 4000 字节处截断 ntext。
  • 是的,这就是我遇到的问题,它将 ntext 截断为 4000 字节。
  • 那么您可能需要将文本拆分并使用两个变量。

标签: c# windows-phone-7 sql-server-ce ntext


【解决方案1】:

无论出于何种原因,我认为您在实际数据库文件中的列不是 ntext。

这对我来说很好用:

    using (NorthwindContext ctx = new NorthwindContext(NorthwindContext.ConnectionString))
    {
        ctx.DeleteDatabase();
        ctx.CreateDatabase();
        var category = new Categories();
        category.CategoryName = "Test";
        category.Description = new string('x', 6666);
        ctx.Categories.InsertOnSubmit(category);
        ctx.SubmitChanges();

        var testCat = ctx.Categories.First();
        if (testCat.Description.Length == 6666)
        {
            MessageBox.Show("Works on my Windows Phone");                
        }
    }

列声明:

[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Description", DbType="NText", UpdateCheck=UpdateCheck.Never)]
        public string Description
        {
            get
            {
                return this._Description;
            }
            set
            {
                if ((this._Description != value))
                {
                    this.OnDescriptionChanging(value);
                    this.SendPropertyChanging();
                    this._Description = value;
                    this.SendPropertyChanged("Description");
                    this.OnDescriptionChanged();
                }
            }
        }

【讨论】:

    【解决方案2】:

    ntext 支持超过 5 亿个字符,因此您遇到的问题与它无关。见http://msdn.microsoft.com/en-us/library/ms172424.aspx

    您可能想查看以下内容:http://msdn.microsoft.com/en-us/library/hh202872(v=vs.92).aspx

    该列表没有提到 ntext,但确实提到了 text。我猜您可能需要提供自己的自定义格式化程序。

    更新

    查看以下修补程序。它涵盖了使用 linq、ce 和 ntext 数据类型时的某些情况。看起来 没有 修复,格式化程序强制 ntext 成为引擎盖下的 nvarchar(4000)。 http://support.microsoft.com/kb/958478

    【讨论】:

    • 晚上回到家,我再看看,看看是不是我做错了什么,可能是这样。
    • 是的,我认为这个修补程序不适用于 windows phone sdk 中嵌入的 sqlce。
    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多