【问题标题】:How to put large text data (~20mb) into sql cs 3.5 database?如何将大文本数据(~20mb)放入 sql cs 3.5 数据库?
【发布时间】:2010-04-19 07:50:11
【问题描述】:

我正在使用以下查询插入一些大文本数据:

internal static string InsertStorageItem =
            "insert into Storage(FolderName, MessageId, MessageDate, StorageData) values ('{0}', '{1}', '{2}', @StorageData)";

我用来执行这个查询的代码如下:

string content = "very very large data";
string query = string.Format(InsertStorageItem, "Inbox", "AXOGTRR1445/DSDS587444WEE", "4/19/2010 11:11:03 AM");
var command = new SqlCeCommand(query, _sqlConnection);
var paramData = command.Parameters.Add("@StorageData", System.Data.SqlDbType.NText);
paramData.Value = content;
paramData.SourceColumn = "StorageData";
command.ExecuteNonQuery(); 

但在最后一行我收到以下错误:

 System.Data.SqlServerCe.SqlCeException 未被用户代码处理
Message=从一种数据类型转换为另一种数据类型时数据被截断。 [ 函数名称(如果已知) = ]
Source=SQL Server Compact ADO.NET 数据提供程序
H结果=-2147467259
本机错误=25920
堆栈跟踪:
       在 System.Data.SqlServerCe.SqlCeCommand.ProcessResults(Int32 小时)
       在 System.Data.SqlServerCe.SqlCeCommand.ExecuteCommandText(IntPtr& pCursor,Boolean& isBaseTableCursor)
       在 System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(CommandBehavior 行为,String 方法,ResultSetOptions 选项)
       在 System.Data.SqlServerCe.SqlCeCommand.ExecuteNonQuery()
       在 Chithi.Client.Exchange.ExchangeClient.SaveItem(项目项,文件夹 parentFolder)
       在 Chithi.Client.Exchange.ExchangeClient.DownloadNewMails(文件夹文件夹)
       在 Chithi.Client.Exchange.ExchangeClient.SynchronizeParentChildFolder(WellKnownFolder wellknownFolder,文件夹 parentFolder)
       在 Chithi.Client.Exchange.ExchangeClient.SynchronizeFolders()
       在 Chithi.Client.Exchange.ExchangeClient.WorkerThreadDoWork(对象发件人,DoWorkEventArgs e)
       在 System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
       在 System.ComponentModel.BackgroundWorker.WorkerThreadStart(对象参数)
内部异常:

现在我的问题是我应该如何将这么大的数据插入到 sqlce db 中?

问候,

阿宁迪亚·查特吉

http://abstractclass.org

【问题讨论】:

  • StorageData字段是如何定义的?
  • db中StorageData的db数据类型为ntext。

标签: c# .net database sql-server-ce


【解决方案1】:

您是否阅读过有关 ntext 数据类型的文档?

可变长度 Unicode 数据 最大长度 230 - 1 (1,073,741,823) 个字符。贮存 大小,以字节为单位,是两倍 输入的字符数

您的超大内容的大小是否大于最大值?如果是这样,那么您就不走运了-您需要一种可以存储比ntext更多数据的数据类型。我的建议:varbinary(MAX) 或 Image。

【讨论】:

    【解决方案2】:

    也许您应该考虑一下为什么必须将如此大量的文本放入数据库中。也许对外部文件的引用(链接 - 路径)会是一个更好的解决方案。

    【讨论】:

    • 我为什么选择这个是因为我正在创建一个桌面邮件存储,所以为每条邮件创建文件真的很乏味,不是吗?
    【解决方案3】:

    您列出的代码应该可以工作。你有没有先检查你的基地?

    我认为它可能是引发异常的其他列之一。按可能性排序:

    1. 消息日期
    2. 消息 ID
    3. 文件夹名称

    因此,首先使用 StorageData=NULL 或一个小文本对其进行测试。

    【讨论】:

    • 非常感谢。什么剧情!!你是对的,我一直认为 StorageData 正在制造问题,因为它很大。真正的罪魁祸首是 MessageId 它也是一个长字符串,只有它失败了,因为我只将它设为 nvarchar(100)。再次感谢这个指针。
    【解决方案4】:

    我建议在创建参数时指定字段的长度:

    var paramData = command.Parameters.Add("@StorageData", System.Data.SqlDbType.NText, /* column length here */);
    paramData.Value = content;
    

    【讨论】:

    • 不,它仍然抛出异常。我使用 content.Length 作为大小。
    • 感谢您的回复。让我告诉你一件事,我将创建一个桌面邮件存储。我仍然不确定如何以优雅的方式存储消息。这是我第一次尝试将消息内容存储在 sqlce db 中。还有其他更好的方法吗?
    • 建议以这种方式添加所有参数,并将长度指定为实际数据库中的列大小 - 这也可能更容易在调试器中发现,因为您可以比较实际的 string.Length 与数据库定义的内容。
    【解决方案5】:

    如果您可以将StorageData 的类型从ntext 更改为image 并将您的内容写入二进制。我想这会对你有所帮助。

    干杯 AK

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-13
      • 2014-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      相关资源
      最近更新 更多