Ozarraga_AB
Ozarraga_AB

Reputation: 979

c# - reading blob from SQL Server and display to picture box

i have seen this site Read / Write BLOBs from / to SQL Server using C# .NET
After it reads the blob from database, it is saving the image to FileSystem.
I'd like to change it.
Instead of saving the Image to FileSystem i'd like to display it to the pictureBox

here are some of its code on reading 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();
    }

What do you think should be replaced? please help me. I am just new to c#

Upvotes: 1

Views: 5521

Answers (2)

Steve
Steve

Reputation: 216273

You should change a something in your example.

  1. Declare your variable fs as MemoryStream fs
  2. Before the initialization of memorystream call
    retval = myReader.GetBytes(1, 1, null, 0, 0);
    to get the total length of your data
  3. Initialize your memorystream as fs = new MemoryStream(retval);
  4. Read your data as you do now.
  5. Before the fs.Close() pass your MemoryStream to the picturebox.Image as `PictureBox1.Image = Image.FromStream(fs);

Upvotes: 1

Chris Dworetzky
Chris Dworetzky

Reputation: 950

You can use MemoryStream to accomplish this. Assuming that the blob is a properly formed image which is supported by the PictureBox control...

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

Upvotes: 2

Related Questions