Ошибка записи> 4000 байт в varbinary (max) через классы linq-to-sql - PullRequest
2 голосов
/ 28 июля 2011

Тип столбца моей базы данных: varbinary (max), (sql server 2008).

Классы Linq to Sql (vs 2010, fx4) сгенерировали для меня этот код:

[global::System.Data.Linq.Mapping.ColumnAttribute
(Storage="_Raw", DbType="VarBinary(MAX)", UpdateCheck=UpdateCheck.Never)]
public System.Data.Linq.Binary Raw
{
  get
  {
    return this._Raw;
  }
  ...

Я хочу вставить файл растрового изображения размером 1,5 Мбайт следующим образом:

var fi = new FileInfo(@"c:\whatever.bmp");
var fs = fi.OpenRead();
var newImage = new Image();

//var buffer = new byte[fs.Length];
//fs.Read(buffer, 0, (int)fs.Length);
//newImage.Raw = buffer;

var buffer = new byte[4000];
fs.Read(buffer, 0, 4000);
newImage.Raw = buffer;

using (var dc = new MyDataContext())
{
  dc.Images.InsertOnSubmit(newImage);
  dc.SubmitChanges();
}
fs.Dispose();

Закомментированные строки - это то, что я хочу, чтобы был код, но они вызывают исключение при вызове SubmitChanges.Линии внизу работают нормально.Но если я увеличу размер буфера до 4001, я получу то же исключение.Мне нужно, чтобы длина fs.Length была больше, чем 1 500 000.

Сообщение об исключении: «Строка или двоичные данные будут обрезаны».Кто-нибудь может объяснить эту ошибку и показать мне, как заставить ее работать?

1 Ответ

0 голосов
/ 30 июля 2011

Тип данных varbinary (max) поддерживает до 2 ^ 31-1 байтов, что означает, что, вероятно, причиной проблемы является не этот тип данных.

Не могли бы вы предоставитьтип исключения?Сообщение об ошибке звучит очень похоже на , поступающее из базы данных .

Я бы дважды проверил определение столбца, чтобы убедиться, что оно действительно является varbinary (max).

Попробуйте использовать SQL Profiler, чтобы увидеть, какой оператор на самом деле отправляется в базу данных.Если Linq To Sql каким-то образом не генерирует более 2 ^ 31-1 байтов из 4001, которые вы отправляете, маловероятно, что Linq To Sql вызовет проблему.

...