0

この質問は以前に尋ねられ、回答があることを認識していますが、この特定の方法ではありません。私はこれを約7時間理解しようとしています。

Access データベース (.mdb) に格納するためにバイト配列に変換する画像があります。

[画像] -> [バイト配列] -> [Access データベース (フィールドは OLE オブジェクト)] ^ この部分はうまくできます。

public byte[] ImageToByte(Image img)
{
    Bitmap BmpImage = new Bitmap(img);
    BmpImage.Save(Application.StartupPath + @"\unmodified.png", System.Drawing.Imaging.ImageFormat.Png);
    MemoryStream mStream = new MemoryStream();
    PartPhoto.Image.Save(mStream, System.Drawing.Imaging.ImageFormat.Png);
    byte[] imgAsByte = mStream.ToArray();
    return imgAsByte;
}

次に、すべてのデータを次のようにデータベースに保存します。

    Part p = new Part();
    p.PartCode = IPC.Text; 
    p.PartName = IPN.Text;
    p.PartDesc = IDESC.Text;
 -->p.PartPhoto = ImageToByte(PartPhoto.Image);
    p.PartSize = size;
    p.PartWeight = weight;
    p.PartType = IPT.Text;
    p.LeadTime = ILT.Text;
    p.PartCost = ICOST.Text;
    p.PartQuantity = IQNT.Text;

    d.Insert(p);

Insert メソッドはこれを行います。

 command.CommandText = "Insert INTO PartInfo (PartCode, PartName, PartDesc, PartPhoto, PartSize, PartWeight, PartType, LeadTime, PartCost, PartQuantity) VALUES('" + p.PartCode + "', '" + p.PartName + "', '" + p.PartDesc + "', '@Pic', '" + p.PartSize + "', '" + p.PartWeight + "', '" + p.PartType + "', '" + p.LeadTime + "', '" + p.PartCost + "', '" + p.PartQuantity + "')";
                    command.Parameters.Add("@Pic", p.PartPhoto);
command.CommandType = CommandType.Text;
connection.Open();
command.ExecuteNonQuery();

データベース (OLE オブジェクト フィールド) に長いバイナリ データとして表示されます。次のように、データベースから DataGridView に読み取ります。

 String query = "SELECT * FROM PartInfo WHERE PartName CONTAINS " + "\"" + PN + "\"";
 connection.Open();
 da.SelectCommand = new OleDbCommand(query, connection);
 da.Fill(dt);

次に、次のように呼び出します。

PartGrid.DataSource = d.dt;
PartGrid.Refresh();

グリッドをリフレッシュします。

これが私の問題です。DataGridView からバイト配列を読み取ることができません。いくつかの異なる方法を試しましたが、常に同じエラーが発生しました:「パラメーターが無効です」

byte[] picBytes = (byte[])PartGrid.Rows[row].Cells[3].Value;
MemoryStream ms = new MemoryStream(picBytes);
Image partPic = Image.FromStream(ms); //ERROR: "Parameter is not valid"
Bitmap bmp = new Bitmap(partPic);
bmp.Save(Application.StartupPath + @"\test.png", System.Drawing.Imaging.ImageFormat.Png);
return partPic;

次のように、バイト配列から画像への変換を呼び出します。

PartPhoto.Image = ImageFromByte(e.RowIndex); 

私が言ったように、私はこれで何時間も立ち往生しており、いらいらしています.

4

1 に答える 1

0

System.IO.File.ReadAllBytesを使用して画像をバイト配列に変換し、 System.IO.File.WriteAllBytesを使用して元に戻してみてください。

于 2013-07-19T21:48:14.317 に答える