从数据库中检索二进制图像数据结果为none

时间:2015-01-23 09:41:50

标签: c# asp.net image winforms

我已将屏幕截图图像保存到数据库并将其转换为二进制代码。但是,一旦我想要检索它,只显示文件名,但图像没有。

我该如何解决这个问题?

以下是我用来将图像保存到数据库的代码(当用户点击图片框时,它会捕获图像(截图)):

public string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:/Example/Database/db1.accdb;";

public static void AddScreenshot()
    {
        _workingRectangle = Screen.PrimaryScreen.Bounds;

        string _dateTime = DateTime.Now.ToString("dd - MM - yyyy - hh - mm - ss tt");

        string _path = "D:/Example/Screenshots/Screenshot " + _dateTime + ".jpg";

        string _fileName = "Screenshot " + _dateTime + ".jpg";

        try
        {
            using (Bitmap bitmap = new Bitmap(_workingRectangle.Width, _workingRectangle.Height))
            {
                using (Graphics g = Graphics.FromImage(bitmap))
                {
                    g.CopyFromScreen(new Point(_workingRectangle.Left, _workingRectangle.Top), Point.Empty, _workingRectangle.Size);
                }

                bitmap.Save(_path, ImageFormat.Jpeg);
            }

            using (OleDbConnection conn = new OleDbConnection(connectionString))
            {
                string query = "INSERT INTO [Capture] ([Path], [FileName], [Data]) VALUES (@Path, @FileName, @Data)";

                conn.Open();

                FileStream fsBLOBFile = new FileStream(_path, FileMode.Open, FileAccess.Read);

                Byte[] bytBLOBData = new Byte[fsBLOBFile.Length];

                fsBLOBFile.Read(bytBLOBData, 0, bytBLOBData.Length);

                fsBLOBFile.Close();

                using (OleDbCommand command = new OleDbCommand(query, conn))
                {
                    command.Parameters.Add("@Path", OleDbType.VarChar);
                    command.Parameters["@Path"].Value = _path;

                    command.Parameters.Add("@FileName", OleDbType.VarChar);
                    command.Parameters["@FileName"].Value = _fileName;

                    OleDbParameter prm = new OleDbParameter("@Data", OleDbType.VarBinary, bytBLOBData.Length, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, bytBLOBData);

                    command.Parameters.Add(prm);

                    command.ExecuteNonQuery();
                }

                conn.Close();
            }
        }

        catch (Exception ex)
        {

        }
    }

这就是我检索它的方式:

private void RetrieveScreenshot()
    {
        DataTable _dt = new DataTable();

        try
        {
            using (OleDbConnection conn = new OleDbConnection(connectionString))
            {
                string query = "SELECT [Path], [FileName], [Data] FROM [Capture]";

                conn.Open();

                using (OleDbCommand command = new OleDbCommand(query, conn))
                using (OleDbDataAdapter adapter = new OleDbDataAdapter(query, conn))
                {
                    adapter.Fill(_dt);

                    GridView1.DataSource = _dt;

                    GridView1.DataBind();

                    adapter.Dispose();
                    command.Dispose();
                }

                conn.Close();
            }
        }

        catch(Exception ex)
        {

        }
    }

结果是这样的:

enter image description here

这是图像,存储在文件夹中:

enter image description here

你的回答非常感谢我!

非常感谢你。

1 个答案:

答案 0 :(得分:0)

您需要先将BLOB转换为字节数组,然后将该字节数组转换为图像。

这是将BLOB转换为字节数组的方法,

 byte[] byteArrayIn = (byte[])_dt.row[0]["data"];

这是您可以用来将字节数组转换为图像的方法

private Image byteArrayToImage(byte[] byteArrayIn)
 {
   return Image.FromStream(new MemoryStream(byteArrayIn));
 }

所有这一切都必须在将数据源设置为gridview首先转换然后设置之前完成。或者,您可以使用OnRowDataBound event将每个字节数组转换为图像,然后设置为网格行。