Как поместить большие текстовые данные (~ 20 МБ) в базу данных sql cs 3.5? - PullRequest
1 голос
/ 19 апреля 2010

Я использую следующий запрос для вставки больших текстовых данных:

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 was unhandled by user code
Message=The data was truncated while converting from one data type to another. [ Name of function(if known) =  ]
Source=SQL Server Compact ADO.NET Data Provider
HResult=-2147467259
NativeError=25920
StackTrace:
       at System.Data.SqlServerCe.SqlCeCommand.ProcessResults(Int32 hr)
       at System.Data.SqlServerCe.SqlCeCommand.ExecuteCommandText(IntPtr& pCursor, Boolean& isBaseTableCursor)
       at System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(CommandBehavior behavior, String method, ResultSetOptions options)
       at System.Data.SqlServerCe.SqlCeCommand.ExecuteNonQuery()
       at Chithi.Client.Exchange.ExchangeClient.SaveItem(Item item, Folder parentFolder)
       at Chithi.Client.Exchange.ExchangeClient.DownloadNewMails(Folder folder)
       at Chithi.Client.Exchange.ExchangeClient.SynchronizeParentChildFolder(WellKnownFolder wellknownFolder, Folder parentFolder)
       at Chithi.Client.Exchange.ExchangeClient.SynchronizeFolders()
       at Chithi.Client.Exchange.ExchangeClient.WorkerThreadDoWork(Object sender, DoWorkEventArgs e)
       at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
       at System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)
InnerException: 

Теперь мой вопрос: как мне вставить такие большие данные в sqlce db?

С уважением,

Анинда Чаттерджи

http://abstractclass.org

Ответы [ 5 ]

3 голосов
/ 19 апреля 2010

Вы читали документы для типа данных ntext?

Данные Unicode переменной длины с максимальная длина 230 - 1 (1 073 741 823) символов. Место хранения размер в байтах, в два раза количество введенных символов

Ваш очень большой контент больше по размеру, чем максимум? Если это так, вам не повезло - вам нужен тип данных, который может хранить больше данных, чем ntext. Мое предложение: varbinary (MAX) или Image.

2 голосов
/ 19 апреля 2010

Возможно, вам следует подумать о том, почему вы должны помещать такие большие объемы текста в базу данных.Возможно, лучшим решением будет ссылка (ссылка - путь) на внешний файл.

1 голос
/ 19 апреля 2010

Код, который вы перечислили, должен работать. Вы сначала проверили свои базы?

Я думаю, что это может быть одна из других колонок, которая выдает исключение. В порядке вероятности:

  1. MessageDate
  2. MessageId
  3. FolderName

Итак, сначала проверьте это с помощью StorageData = NULL или небольшого текста.

0 голосов
/ 19 апреля 2010

I, если вы можете изменить тип StorageData с ntext на image и записать свой контент как двоичный. Я думаю, это поможет вам.

Приветствие AK

0 голосов
/ 19 апреля 2010

Я бы предложил указать длину поля при создании параметра:

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