2009-04-01 9 views
1

ブラウザに表示するためにlinqを使用してDBからバイナリを返そうとしています。 ado.netを使用して以下のメソッドが動作しますが、linqにypgradeしようとしていますが、linqのバージョンがエラーを返しました。エラー:System.Data.Linq.Binary 'を' 1次元のバイト配列 'に変換できません

Public Sub ProcessRequest(ByVal context As System.Web.HttpContext) 
    Dim imageId As String = context.Request.QueryString("id") 
    Dim ret As DataTable = Nothing 
    ret = DPGetImageData.GetImageById(Convert.ToInt64(imageId)) 

     For Each dt As DataRow In ret.Rows 
      For Each c As DataColumn In ret.Columns 
       If Not (dt(c) Is Nothing) Then 
        context.Response.Clear() 
        context.Response.BufferOutput = False 
        context.Response.OutputStream.Write(CType(dt.Table.Rows(0).Item("imageData"), Byte()), 0, CInt(dt.Table.Rows(0).Item("imageSize"))) 
        context.Response.End() 
       End If 

      Next 
     Next 


End Sub 

ワーキングLINQのバージョン:

Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest 
    If Not String.IsNullOrEmpty(Current.Request.QueryString("Id")) Then 
     Dim imageId = HttpContext.Current.Request.QueryString("Id") 
     Dim result = repository.FindById(Convert.ToInt64(imageId)).imageData.ToArray 
     HttpContext.Current.Response.BinaryWrite(result) 
     context.Response.End() 

    End If 
End Sub 

答えて

2

あなたは単にResponse.BinaryWrite(result.ToArray())を呼び出すことができます。 paranthesesに注目してください。ToArrayはメソッド呼び出しです。

+0

良いキャッチ、私はVBでも知っていない:) – leppie

0

あなたはBinary.ToArrayとしてキャストを必要はありません、すでにバイト配列を返します。

代わりに、バイト配列を直接使用することもできます。デザイナーで変更することができます。

UPDATE:

私は完全にはわからないが、それはあなたのDataContextが既に破棄されていることが考えられます。バイナリタイプは遅延ロードを使用していると思います。

スタックトレースを追加すると、そのような場合があります。

+0

データがモデルに含まれていなかったので、私は常にnull参照を取得していました。私は大容量のファイルでどれくらいの優先度があるか分かりません。私は誰かがそれに話すことを願っています。私はまた、この記事http://tinyurl.com/ck39un/を見つけました。それは私のための空白の多くを埋める。 – ruffone

関連する問題