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 に増やすと、同じ例外が発生します。fs.Length を 1,500,000 以上にする必要があります。

例外メッセージは、「文字列またはバイナリ データが切り捨てられます」です。誰かがこのエラーを説明し、それを機能させる方法を教えてもらえますか?

4

1 に答える 1

0

varbinary(max)データ型は最大 2^31-1 バイトをサポートします。これは、おそらくこのデータ型が問題の原因ではないことを意味します。

例外の種類を教えてください。エラー メッセージは、データベースからのものと非常によく似ています。

列の定義を再確認して、実際に varbinary(max) であることを確認します。

SQL プロファイラーを使用して、実際にデータベースに送信されているステートメントを確認してください。Linq To Sql が送信している 4001 のうち 2^31-1 バイト以上を生成していない限り、Linq To Sql が問題を引き起こしている可能性は低いです。

于 2011-07-30T04:12:33.650 に答える