Вставка байтового массива размером более 8 Кбайт

Я использую код

cmd.Parameters.Add("@Array", SqlDbType.VarBinary).Value = Array; 

В описании SqlDbType.VarBinary указано, что он может обрабатывать только массив размером до 8 Кбайт. У меня есть массив байтов, который представляет изображение и может идти до 10 килобайт.

Как сохранить это в столбце varbinary (max) с помощью C #?

У меня нет проблем с созданием массива. При попытке выполнить запрос я застрял в этом пределе 8k.

Изменить. Позвольте мне пояснить, что на моей машине даже файлы размером до 15k байт сохраняются в базе данных в столбце varbinary (MAX), когда я запускаю приложение asp.net локально, но как только я развернул его, изображения не будут сохранены. Затем я прибег к резкому изменению размеров изображений, чтобы их размер был меньше, чем 8K, и теперь изображения будут храниться без каких-либо проблем.

Нет, это то, что на самом деле описывает описание:

Массив типа Byte. Поток двоичных данных переменной длины в диапазоне от 1 до 8000 байт. Неявное преобразование завершается с ошибкой, если размер байтового массива превышает 8000 байт. Явно задайте объект при работе с байтовыми массивами размером более 8000 байт.

Я бы предположил, что это на самом деле означает, что вы не можете использовать AddWithValue, чтобы иметь параметр, выводящий тип как VarBinary, если массив байтов содержит более 8000 элементов. Вам нужно будет использовать Add, указать тип параметра самостоятельно, а затем установить свойство Value, то есть использовать это:

 command.Parameters.Add("@MyColumn", SqlDbType.VarBinary).Value = myByteArray; 

а не это:

 command.Parameters.AddWithValue("@MyColumn", myByteArray); 

Возможно, вы могли бы посмотреть на функцию Sql Server FILESTREAM, поскольку она предназначена для хранения файлов. Он в основном сохраняет указатель на ваш файл, и файл хранится непосредственно в файловой системе (в каталоге данных баз данных).

Мне нравится FILESTREAM, так как это означает, что вы продолжаете использовать интерфейс к базе данных (например, SQLClient), а затем выходите на adhoc-метод для чтения / записи файлов на жесткий диск. Это означает, что вам будет обеспечена безопасность, так как ваше приложение не нуждается в специальных разрешениях для доступа к файловой системе.

Быстрый google дал эту статью при использовании filestream в c #, но я уверен, что есть много других.

ОБНОВЛЕНИЕ после OP EDIT

Таким образом, после развертывания на другом сервере загрузка не удалась? Возможно, проблема заключается не в вставке sql, а в том, что существует ограничение на длину содержимого запроса HTTP, например, в вашем web.config элемент httpRuntime имеет атрибут maxRequestLength . Если это установлено на низкое значение, возможно, это проблема. Таким образом, вы можете установить что-то вроде этого (задает максимум 6 МБ над проблемой 10 КБ):

 <system.web> <httpRuntime maxRequestLength="6144" /> 

Единственное, что здесь, – это ограничение на 4MB для покупки по умолчанию: |

Добавление длины данных, по-видимому, является исправлением

 var dataParam = cmd.Parameters.AddWithValue("@Data", (object)data.Data ?? DBNull.Value); if (data.Data != null) { dataParam.SqlDbType = SqlDbType.VarBinary; dataParam.Size = data.Data.Length; }