2

我的数据库列的类型是 varbinary(max), (sql server 2008)。

Linq to Sql Classes (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 Mb 的位图文件:

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,我会得到同样的异常。我需要有一个更像 1,500,000 的 fs.Length。

异常消息是“字符串或二进制数据将被截断”。谁能解释这个错误并告诉我如何让它工作?

4

1 回答 1

0

varbinary(max)数据类型最多支持 2^31-1 个字节,这意味着导致问题的可能不是这种数据类型。

您能否提供异常的类型?错误消息听起来很像是来自数据库

我会仔细检查该列的定义,以确保它确实是一个 varbinary(max)。

尝试使用 SQL Profiler 查看实际发送到数据库的语句。除非 Linq To Sql 以某种方式从您发送的 4001 中生成超过 2^31-1 个字节,否则不太可能是 Linq To Sql 导致问题。

于 2011-07-30T04:12:33.650 回答