2013-09-12 3 views
0

При запуске этого кода я получаю исключение «Параметр недопустим». Я пытаюсь отобразить изображение, которое приходит из базы данных:Параметр недопустим в потоке памяти

SqlConnection con = new SqlConnection("data source=.;Initial catalog=RMSDB;user=sa;password=....;"); 
con.Open(); 
string sql = String.Format("Select Emp_Pic_ImageData From Employees where Emp_Id='{0}'", TxtBoxId.Text); 
SqlCommand cmd = new SqlCommand(sql, con); 
SqlDataReader reader = cmd.ExecuteReader(); 
reader.Read(); 
if (reader.HasRows) 
{ 
    byte[] img = (byte[])(reader[0]); 
    if (img == null) 
    { 
     PicboxEmployee.Image = null; 
    } 
    else 
    { 
     MemoryStream mstrm = new MemoryStream(img); 
     PicBoxName.Image = Image.FromStream(mstrm); //error: "Parameter is not valid" 
    } 
} 
else 
{ 
    MessageBox.Show("this not exists"); 
} 
+6

Что такое 'img', откуда оно взялось? – olydis

+0

Что такое параметр typeof (img) –

+6

* Вот ошибка «Параметр недопустим * Средства« MemoryStream' не имеет допустимого формата изображения. –

ответ

1

«параметр не является действительной» ошибка происходит потому, что массив вы принесли обратно из базы данных не представляет действительное изображение двоичных данных ,

Возможны различные причины. Вначале взгляните на данные в своей базе данных - возможно, вы не храните двоичные данные, которые вы ожидаете.

В то же время, я быстро бросил вместе небольшое консольное приложение, которое делает то, что вы после:

class LoadImageFromDbSpike 
{ 
    private const string ConnectionString = @"Data Source=[SERVERNAME];Initial Catalog=[DBNAME];Trusted_Connection=true;Connect Timeout=180;"; 
    private const string ImageOnDiskPath = @"c:\test.png"; 
    private const string OutputPath = @"c:\output.png"; 

    static void Main(string[] args) 
    { 
     var imageData = File.ReadAllBytes(ImageOnDiskPath); 

     var imageId = StoreImageData(imageData); 

     var imageDataFromDb = LoadImageData(imageId); 
     File.WriteAllBytes(OutputPath, imageDataFromDb); 
    } 


    private static int StoreImageData(IEnumerable<byte> imageData) 
    { 
     const string insertCommand = "INSERT INTO ImageSpike (Image) " + 
            "VALUES (@ImageData); " + 
            "SELECT SCOPE_IDENTITY();"; 

     using (var con = new SqlConnection(ConnectionString)) 
     using (var cmd = new SqlCommand(insertCommand, con)) 
     { 

      cmd.Parameters.AddWithValue("@ImageData", imageData); 
      cmd.Connection.Open(); 

      return (int) (decimal) cmd.ExecuteScalar(); 
     } 
    } 

    private static byte[] LoadImageData(int id) 
    { 
     const string loadImageCommand = "SELECT TOP 1 Image FROM ImageSpike " + 
             "WHERE Id = @Id; "; 

     using (var con = new SqlConnection(ConnectionString)) 
     using (var cmd = new SqlCommand(loadImageCommand, con)) 
     { 
      cmd.Parameters.AddWithValue("@Id", id); 
      cmd.Connection.Open(); 

      var result = cmd.ExecuteScalar(); 
      return (byte[]) result; 
     } 
    } 
} 
+0

. Снова такая же ошибка – Slan

+0

Ниже мой код для сохранения изображения – Slan

+0

См. Обновленный ответ ... –

0
//code for saving image into sql server 2008 r2////// 
      byte[] img = null; 
      FileStream fs = new FileStream(imgLoc,FileMode.Open,FileAccess.Read); 
      BinaryReader br=new BinaryReader(fs); 
      img = br.ReadBytes((int)fs.Length); 


      string conn = "data source=.;Initial catalog=RMSDB;user=sa;password=ibs;"; 
      SqlConnection con = new SqlConnection(conn); 
      con.Open(); 
      string cmdd = String.Format("INSERT INTO Employees (Emp_Pic_ImageData) VALUES('{0}')", @img); 

      SqlCommand cmd = new SqlCommand(cmdd, con); 

      cmd.Parameters.Add(new SqlParameter("@img",img)); 
      int tempss = cmd.ExecuteNonQuery(); 
+0

выше код предназначен для сохранения файла, правильно? – Slan

+0

Ниже приведен код для получения изображения. Есть ли какая-либо ошибка в обоих кодах? – Slan

0
//code for retrival of image from sql server//////////// 


      string sql = String.Format("Select Emp_Pic_ImageData From Employees where Emp_Id='{0}'", TxtBoxId.Text); 
      SqlCommand cmd = new SqlCommand(sql, con); 
      SqlDataReader reader = cmd.ExecuteReader(); 
      reader.Read(); 
      if (reader.HasRows) 
      { 
       byte[] img = (byte[])(reader[0]); 
       if (img == null) 
       { 
        PicboxEmployee.Image = null; 
       } 
       else 
       { 
        MemoryStream mstrm = new MemoryStream(img); 
        PicboxEmployee.Image = new System.Drawing.Bitmap(mstrm); //there is error of parameter is not valid. 

       } 
      } 
      else 
      { 

       MessageBox.Show("this not exists"); 

      } 
-1

проблема в том, что, вы предъявляете его неправильно из база данных. попробуйте изменить свой код для этого:

while (registry.Read()) 

{     
       byte[] image = (byte[])registry["Image"];  

} 
Смежные вопросы