2

Products製品の写真を含むという名前のテーブルを持つデータベースがあります。

画像をメモリに保存するには

public byte[] Picture

したがって、私のデータベースでは varbinary 型です (自動的に変換されます)。したがって、データベースから画像を pictureBox1.Image に表示する必要があります。このようなもの:

 var q_pic = from p in context.Products
                         where p.ID == value // Id of product that i want 
                         select new
                         {
                             p.Picture
                         };

そしていま

picutreBox1.Image = ??

原因

pictureBox1.Image = q_pic // doeasn't work

私はこれを試しました:

var bytes = from p in context.Products
                        where p.ID == value // Id of product that i want 
                        select p.Picture;
            if (bytes != null)
            {
                using (var ms = new MemoryStream(bytes))
                {
                    using (var image = Image.FromStream(ms))
                    {
                        pictureBox1.Image = (Image)image.Clone();
                    }
                }
            }

そしてこれを取得

Error   1   The best overloaded method match for 'System.IO.MemoryStream.MemoryStream(byte[])' has some invalid arguments   

Error   2   Argument 1: cannot convert from 'System.Linq.IQueryable<byte[]>' to 'byte[]'    
4

5 に答える 5

1

Reed Copsey のリストから、Product オブジェクトの byte[] を取得したポイントにたどり着きます。PictureBox の Image プロパティに配置するには、バイト配列を Image に変換する必要があります。

 using (var ms = new System.IO.MemoryStream(q_pic)) {
    using(var img = Image.FromStream(ms)) {
       pictureBox1.Image = img;
    }
 }
于 2013-11-01T19:02:51.957 に答える
1

おそらく、次のようなものが必要です。

var q_pic = from p in context.Products
                     where p.ID == value // Id of product that i want 
                     select p.Picture;

// FirstOrDefault will return null if there were no matches
pictureBox1.Image = q_pic.FirstOrDefault();

IEnumerable<T>元の主な問題は、匿名型を (不必要に) 使用していて、画像自体だけでなくに割り当てようとしたことでした。new {...クエリから を削除すると最初の問題が解決され、 を使用するとから 1 つ (最初の) がFirstOrDefault抽出されます。TIEnumerable<T>


あなたのコメントを考えると、クエリがbyte[]画像ではなく を返すことは明らかです。次のように記述する必要があります。

var first = context.Products.FirstOrDefault(p => p.ID == value);
if (first != null)
{
     using (var ms = new MemoryStream(first.Picture)) 
     {
         using(var image = Image.FromStream(ms)) 
         {
             pictureBox1.Image = (Image)image.Clone();
         }
     }
}
于 2013-11-01T18:56:29.947 に答える
0

作るだけ

byte[] imgdata;


string id = dataGridViewX1.SelectedRows[0].Cells[0].Value.ToString();
var q = db.tbl_aezas.First(c => c.id == id);
imgdata = q.image.ToArray();
System.IO.MemoryStream ms = new System.IO.MemoryStream(imgdata);
pictureBox1.Image = Image.FromStream(ms);
于 2016-07-13T08:24:30.550 に答える
0

LINQ を使用すると、データベースから「System.Data.Linq.Binary」型を取得します。この型にはToArray()、 を返すメソッドがありますbyte[]。次のようなコードを修正する必要があります。

var bytes = from p in context.Products
                        where p.ID == value // Id of product that i want 
                        select p.Picture;
byte[] trueBytes = bytes.ToArray();
if (trueBytes != null)
{
    using (var ms = new MemoryStream(trueBytes))
    {
        using (var image = Image.FromStream(ms))
        {
            pictureBox1.Image = (Image)image.Clone();
        }
    }
}
于 2013-11-04T02:56:30.773 に答える