c# - 从SQL Server读取blob并显示到图片框

时间:2012-03-11 05:08:42

标签: c# winforms

我看过这个网站 Read / Write BLOBs from / to SQL Server using C# .NET
从数据库中读取blob后,它将图像保存到FileSystem 我想改变它。
而不是将图像保存到FileSystem我想将它显示到pictureBox

这里有一些关于阅读BLOB的代码

// **** Read BLOB from the Database and save it on the Filesystem
    public void GetEmployee(string plastName,string pfirstName)
    {
        SqlCommand getEmp = new SqlCommand(
            "SELECT EmployeeID, Photo "+
            "FROM Employees "+
            "WHERE LastName = @lastName "+
            "AND FirstName = @firstName", _conn);

        getEmp.Parameters.Add("@LastName",  SqlDbType.NVarChar, 20).Value = plastName;
        getEmp.Parameters.Add("@FirstName", SqlDbType.NVarChar, 10).Value = pfirstName;

        FileStream fs;                          // Writes the BLOB to a file (*.bmp).
        BinaryWriter bw;                        // Streams the BLOB to the FileStream object.
        int bufferSize = 100;                   // Size of the BLOB buffer.
        byte[] outbyte = new byte[bufferSize];  // The BLOB byte[] buffer to be filled by GetBytes.
        long retval;                            // The bytes returned from GetBytes.
        long startIndex = 0;                    // The starting position in the BLOB output.
        string emp_id = "";                     // The employee id to use in the file name.

        // Open the connection and read data into the DataReader.
        _conn.Open();
        SqlDataReader myReader = getEmp.ExecuteReader(CommandBehavior.SequentialAccess);

        while (myReader.Read())
        {
            // Get the employee id, which must occur before getting the employee.
            emp_id = myReader.GetInt32(0).ToString();

            // Create a file to hold the output.
            fs = new FileStream("employee" + emp_id + ".bmp",
                                FileMode.OpenOrCreate, FileAccess.Write);
            bw = new BinaryWriter(fs);

            // Reset the starting byte for the new BLOB.
            startIndex = 0;

            // Read the bytes into outbyte[] and retain the number of bytes returned.
            retval = myReader.GetBytes(1, startIndex, outbyte, 0, bufferSize);

            // Continue reading and writing while there are bytes beyond the size of the buffer.
            while (retval == bufferSize)
            {
                bw.Write(outbyte);
                bw.Flush();

                // Reposition the start index to the end of the last buffer and fill the buffer.
                startIndex += bufferSize;
                retval = myReader.GetBytes(1, startIndex, outbyte, 0, bufferSize);
            }

            // Write the remaining buffer.
            bw.Write(outbyte, 0, (int)retval);
            bw.Flush();

            // Close the output file.
            bw.Close();
            fs.Close();
        }

        // Close the reader and the connection.
        myReader.Close();
        _conn.Close();
    }

您认为应该替换什么? 请帮我。我刚认识c#

2 个答案:

答案 0 :(得分:1)

您可以使用MemoryStream来完成此任务。假设blob是PictureBox控件支持的正确形成的图像...

    MemoryStream memoryStream = new MemoryStream(outbyte);
    pictureBox.Image = Image.FromStream(memoryStream);

答案 1 :(得分:1)

您应该更改示例中的内容。

  1. 将变量fs声明为MemoryStream fs
  2. 在memorystream调用初始化之前 retval = myReader.GetBytes(1, 1, null, 0, 0);
    获取数据的总长度
  3. 将您的记忆流初始化为fs = new MemoryStream(retval);
  4. 像现在一样阅读您的数据。
  5. 在fs.Close()之前将MemoryStream传递给picturebox.Image为 `PictureBox1.Image = Image.FromStream(fs);