title: Saving an Image file to sql Server and converting byte array into image
body: <p>I am storing images in a database and would like to convert them from byte array to image. I have no problem converting an object to byte array but I get an error of "Parameter is not valid" when trying to convert from byte array to image. The object I am passing to my method is from a dataset row.</p>
  
  <p><strong>Stored procedure</strong></p>
  
  <pre><code>USE [----------------]
  GO
  /****** Object:  StoredProcedure [dbo].[usp_imageloader_add_test]    Script Date: 01/16/2012    09:19:46 ******/
  SET ANSI_NULLS ON
  GO
  SET QUOTED_IDENTIFIER ON
  GO
  ALTER   procedure [dbo].[usp_imageloader_add_test]
  @p_Image Image
  as 
  
  INSERT into Test_Images VALUES(@p_Image)
  </code></pre>
  
  <p><strong>Upload File control</strong> /convert Image file to byte array and save data to database</p>
  
  <pre><code> protected void btnUpload_Click(object sender, EventArgs e)
      {
          if (ctrlUpload.PostedFile != null)
          {
              if (ctrlUpload.PostedFile.ContentLength &gt; 0)
              {
                  // Get Posted File
                  HttpPostedFile objHttpPostedFile = ctrlUpload.PostedFile;
  
                  // Find its length and convert it to byte array
                  int ContentLength = objHttpPostedFile.ContentLength;
  
                  // Create Byte Array
                  byte[] bytImg = new byte[ContentLength];
  
                  // Read Uploaded file in Byte Array
                  objHttpPostedFile.InputStream.Read(bytImg, 0, ContentLength);
  
                  using (SqlConnection dbConnection = new SqlConnection(app_settings.sql_conn_string_db))
                  {
                      try
                      {
                          string sql = "usp_imageloader_add_test";
                          SqlCommand cmd = new SqlCommand(sql, dbConnection);
                          cmd.CommandType = System.Data.CommandType.StoredProcedure;
                          cmd.Parameters.AddWithValue("@p_Image", bytImg).SqlDbType = SqlDbType.Binary;
                          cmd.Connection.Open();
                          cmd.ExecuteNonQuery();
                          cmd.Connection.Close();
                      }
  
  
                      catch (Exception ex)
                      {
                          ex.Message.ToString();
                      }
                  }
              }
          }
      }
  </code></pre>
  
  <p><strong>Table method which calls objToImg method</strong></p>
  
  <pre><code>protected void Page_Load(object sender, EventArgs e)
      {
          generateTable(false);
      }
  
  
  private Table generateTable(bool flag)
      {
          Table tb = BuildList(GetData(), flag);
          if (imgloadercms != null)
          {
  
              PlaceHolder ph = new PlaceHolder();
              StringBuilder sb = new StringBuilder();
              ph.Controls.Add(new LiteralControl(sb.ToString()));
          }
          imgloadercms.Controls.Add(tb);
          return tb;
      }
  
  
  protected Table BuildList(DataTable tb, bool flag)
      {   
          Table tblImageLibrary = new Table();
          tblImageLibrary.BorderStyle = BorderStyle.Solid;
          tblImageLibrary.BorderWidth = Unit.Pixel(8);
  
          if (tb.Rows.Count &gt; 0)
          {
              try
              {
                  if (!flag)
                  {
  
                      tblImageLibrary.BorderColor = Color.Black;
                      tblImageLibrary.BorderWidth = Unit.Pixel(1);
                      TableRow tr = new TableRow();  // Table row for header of table
                      tr.BackColor = Color.LightBlue;
  
                      TableCell c1 = new TableCell();
                      TableCell c2 = new TableCell();
  
  
                      c1.Controls.Add(new LiteralControl("Image Id"));
                      tr.Cells.Add(c1);
                      c2.Controls.Add(new LiteralControl("Image"));
                      tr.Cells.Add(c2);
  
                      tblImageLibrary.Rows.Add(tr);
                  }
  
                  int i = 0;
  
                  foreach (DataRow r in tb.Rows) // Create new row foreach row in table
                  {
                      TableRow tr = new TableRow();
                      if (i % 2 == 0)
                      {
                          tr.BackColor = Color.LightYellow;
                      }
                      // Build cells
                      TableCell c1 = new TableCell();
                      TableCell c2 = new TableCell();
                      c2.Width = 300;
  
                      c1.Controls.Add(new LiteralControl(r["Image_Id"].ToString()));
                      tr.Cells.Add(c1);
  
                      // Call method to serialize obj to byte array
                      //System.Drawing.Image dbImg = 
                      ObjToImg(r["Image_File"]);
  
                 }
              catch (Exception ex)
              {
                  ex.ToString();
              }
              if (!flag)
              {
  
              }
          }
          return tblImageLibrary;
      }
  </code></pre>
  
  <p><strong>Return Image</strong></p>
  
  <pre><code>  private System.Drawing.Image ObjToImg(object obj)
      {
          //byte[] byteArray = null;
  
          if (obj == null)
              return null;
          else
          {
  
              BinaryFormatter bf = new BinaryFormatter();
              using (MemoryStream ms = new MemoryStream())
              {
                  bf.Serialize(ms, obj); //now in Memory Stream
                  ms.ToArray(); // Array object
                  ms.Seek(0, SeekOrigin.Begin);
  
                  //return (System.Drawing.Image)bf.Deserialize(ms);
  
                  System.Drawing.Image myImage = (System.Drawing.Image)bf.Deserialize(ms);
  
                  return myImage;
              }
  </code></pre>
  
  <p>Whenever I try to add the memory stream object to the image object constructor I get the error message of "Parameter is not valid". Maybe I made a mistake when insert the byte array into the database because I have looked at other code and it doesn't make sense how it's not working.</p>