2013-08-02 5 views
2

Я искал решения, но не знаю, где я делаю это неправильно. Но я делаю это в первый раз.Загрузить изображение в базу данных SQL

У меня есть класс Студенты

class Students 
{ 

    public Image photo { get; set; } 


    public bool AddStudent(Students _student) 
    { 
     Settings mySettings = new Settings(); 

     SqlCeConnection conn = new SqlCeConnection(mySettings.StudentsConnectionString); 
     SqlCeCommand cmd = new SqlCeCommand(); 
     cmd.CommandType = System.Data.CommandType.Text; 
     cmd.Connection = conn; 
     cmd.CommandText = "insert into students (firstname, lastname, dob, allergic, allergydetails, memo, address, photo) " + 
          "Values (" + 
          "'" + @FirstName + "'," + 
          "'" + @LastName + "'," + 
          "'" + @Dob + "'," + 
          "'" + @isAllergic + "'," + 
          "'" + @AllergyDetails + "'," + 
          "'" + @Memo + "'," + 
          "'" + @photo + "'," + 
          "'" + @Address + "')"; 

     cmd.Parameters.Add("@FirstName", _student.FirstName); 
     cmd.Parameters.Add("@LastName", _student.LastName); 
     cmd.Parameters.Add("@Dob", _student.Dob); 
     cmd.Parameters.Add("@isAllergic", _student.isAllergic); 
     cmd.Parameters.Add("@AllergyDetails", _student.AllergyDetails); 
     cmd.Parameters.Add("@Memo", _student.Memo); 


     cmd.Parameters.Add("@photo", _student.photo); 

     cmd.Parameters.Add("@Address", _student.Address); 

     try 
     { 
      conn.Open(); 
      cmd.ExecuteNonQuery(); 
      conn.Close(); 
      return true; 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message.ToString()); 
      return false; 
     } 
     finally 
     { 
      if (conn.State == System.Data.ConnectionState.Open) conn.Close(); 
      cmd = null; 
     } 
    } 

Теперь я передаю значение свойств от моей формы, как это.

private void btnAdd_Click(object sender, EventArgs e) 
     { 

      Students myStudent = new Students(); 

      myStudent.FirstName = txtFirstName.Text.Trim(); 
      myStudent.LastName = txtLastName.Text.Trim(); 
      myStudent.Dob = dtPicker1.Value; 
      myStudent.Memo = txtMemo.Text.Trim(); 
      myStudent.Address = txtAddress.Text.Trim(); 

      myStudent.photo = Image.FromFile(openFileDialog1.FileName); 

      // Insert New Record 
      if (myStudent.AddStudent(myStudent)) 
       MessageBox.Show("Student Added Successfully"); 


     } 

Я получаю следующее сообщение об ошибке

отображение не существует из DBTYPE System.Drawing.Bitmap к известному SqlCeType.

Но я не знаю, почему я не преуспеваю. Любое предложение будет высоко оценено.

+0

вам необходимо преобразовать изображение в байты [], он может быть сохранен в типе данных изображений http://msdn.microsoft. com/en-us/library/ms172424.aspx –

+0

По моему опыту, в то время как это делалось ... вы должны использовать BLOB-поле в БД и передать изображение в байтовый массив, прежде чем поместить его в поле BLOB , –

+0

Вы не понимаете, мой вопрос другой. Сначала я держу фотографию в экземпляре класса, а затем загружаю ее в db. В этом случае у меня нет таких функций, как openfiledialog.filename и т. Д. –

ответ

4

Попробуйте преобразовать изображение в массив Byte[] и затем сохранить.

private void btnAdd_Click(object sender, EventArgs e) 
{ 
    Students myStudent = new Students(); 
    ... 
    ... 
    // change the student photo to byte array e.g. 
    // public byte[] Photo {get;set;} 
    myStudent.photo = imageToByteArray(Image.FromFile(openFileDialog1.FileName)); 
    ... 
    ... 
    // Insert New Record 
    if (myStudent.AddStudent(myStudent)) 
    MessageBox.Show("Student Added Successfully"); 
} 

// convert image to byte array 
public byte[] imageToByteArray(System.Drawing.Image imageIn) 
{ 
    MemoryStream ms = new MemoryStream(); 
    imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg); 
    return ms.ToArray(); 
} 

//Byte array to photo 
public Image byteArrayToImage(byte[] byteArrayIn) 
{ 
    MemoryStream ms = new MemoryStream(byteArrayIn); 
    Image returnImage = Image.FromStream(ms); 
    return returnImage; 
} 

Примечание: Ваш DataType в базе данных должен быть image Типу

+0

Привет, спасибо за помощь, но она совсем не работает. Я получаю это сообщение об ошибке на cmd.executenonQuery(). Ошибка заключается в следующем: «Преобразование не поддерживается. [Тип для преобразования из (если известен) = nvarchar, Тип для преобразования в (если известен) = изображение]» –

+0

Каков тип данных фотографии в БД? – PawanS

+0

Это изображение .... –

0

Chech из этой ссылке ..

http://www.codeproject.com/Articles/25956/Sending-Receiving-PictureBox-Image-in-C-To-From-Mi

Вы действительно должны хранить изображения в базе данных?

Вы можете выполнить эту задачу с гораздо меньшими усилиями, если просто сохранить изображение в папке (загрузить его в приложение), а затем сохранить путь к этому изображению в базе данных в поле «Varchar». Я работал больше на веб-сайтах, но основы должны быть одинаковыми, я думаю ....

+0

Да, я считаю, что это то, что я должен сделать сейчас. Это автономное приложение на базе настольного ПК, которое использует локальную базу данных. Поэтому мне будет лучше хранить место этого изображения. Или может быть Скопировать это изображение в мою определенную папку, так что даже если пользователь удалит изображение из этого места, у нас будет копия –

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