arvindispra Ответов: 2

Изображение не сохраняется в базе данных


void conv_photo()
        {
            //converting photo to binary data
            if (pictureBox3.Image != null)
            {
                ms = new MemoryStream();
                pictureBox3.Image.Save(ms, ImageFormat.Jpeg);
                byte[] photo_aray = new byte[ms.Length];
                ms.Position = 0;
                ms.Read(photo_aray, 0, photo_aray.Length);
                cmd.Parameters.AddWithValue("@photo", photo_aray);
            }
        }

 private void btnsave_Click(object sender, EventArgs e)
        {
            if (comboBox1.SelectedIndex >= 0 && textBox1.Text != "" && textBox2.Text != "" && textBox3.Text != "" && comboBox2.SelectedIndex >= 0 && textBox4.Text != "" && richTextBox1.Text != "")
            {
                try
                {
                    
                    //cmd = new SqlCommand("insert into student_details(class,reg_num,name,father,gender,dob,phone,adrs,img) values('" + comboBox1.Text + "','" + textBox1.Text + "','" + textBox2.Text + "','" + textBox3.Text + "','" + comboBox2.Text + "','" + dateTimePicker1.Text + "','" + textBox4.Text + "','" + richTextBox1.Text + "',@photo)", con);
                    string cmdtext = "insert into student_details(class,reg_num,name,father,gender,dob,phone,adrs,img) values(@class,@reg_num,@name,@father,@gender,@dob,@phone,@adrs,@photo)";
                    SqlCommand cmd = new SqlCommand(cmdtext, con);
                    cmd.Parameters.AddWithValue("@class", comboBox1.Text);
                    cmd.Parameters.AddWithValue("@reg_num", textBox1.Text);
                    cmd.Parameters.AddWithValue("@name", textBox2.Text);
                    cmd.Parameters.AddWithValue("@father", textBox3.Text);
                    cmd.Parameters.AddWithValue("@gender", comboBox2.Text);
                    cmd.Parameters.AddWithValue("@dob", DateTime.Parse(dateTimePicker1.Text));
                    cmd.Parameters.AddWithValue("@phone", textBox4.Text);
                    cmd.Parameters.AddWithValue("@adrs", richTextBox1.Text);
                   
                    conv_photo();
                    con.Open();
                    int n = cmd.ExecuteNonQuery();
                    con.Close();
                    if (n > 0)
                    {
                        MessageBox.Show("record inserted");
                        load();
                        DisplaySummary();
                        student_form_clear();
                        getregnum();
                    }
                
                else
                    MessageBox.Show("insertion failed, please select class and gender");
                
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            }
            else
            {
                MessageBox.Show("Please fill all entries");
            }
            
        }


Что я уже пробовал:

Я пытаюсь использовать этот код, но не могу сохранить изображение в базе данных. кроме изображения, все данные легко сохраняются.
Ошибка: необходимо объявить переменную sclare @photo
Я использовал следующий тип данных
img = изображение;
дата рождения = дата;
и варчар для других.

где проблема пожалуйста помогите мне
заранее спасибо

2 Ответов

Рейтинг:
0

Richard MacCutchan

Вы создаете новый SqlCommand объект с именем cmd внутри вашего btnsave_Click метод, как локальная переменная. Однако, когда вы тогда позвоните conv_photo чтобы сохранить изображение код там ссылается на другой cmd объект, который был объявлен где-то еще в вашем коде. Вы должны пройти cmd объект в качестве параметра conv_photo таким образом, вы уверены, что он обращается к правильному объекту.


Рейтинг:
0

OriginalGriff

Это довольно просто: у вас есть объект sqlcommand уровня класса с именем cmd к которому вы добавляете изображение в качестве параметра в своем conv_photo метод. Но...в вашем btnsave_Click метод вы создаете новую локальную переменную с тем же именем:

SqlCommand cmd = new SqlCommand(cmdtext, con);
Который вы используете для выполнения операции вставки.
Поскольку они оба не используют один и тот же экземпляр SqlCommand, параметр @photo добавляется к неправильной SqlCommand, и в результате SQL жалуется.
- Я? Я бы удалил версию уровня класса и передал соответствующий объект SqlCommand в conv_photo метод, гарантирующий, что вы всегда добавляете его в правильный экземпляр.
И Ваше обращение не должно быть таким сложным:
MemoryStream ms = new MemoryStream();
imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] data = ms.ToArray();

будут делать это.