Сохранить изображение в MS Access
От: elvik Россия  
Дата: 18.10.06 08:24
Оценка:
Здравствуйте, уважаемые.

Пишу приложение на C# + БД на MS Access (Framework 2.0)
Одно из полей имеет тип OLE-объекта и в нем мне необходимо хранить изображение.
Для связи контролов на форме с датасетом используется компонент BindingSource

В локальном типизированном датасете данные хранятся в поле с типом byte[]
Для приведения изображения к этому типу я использую следующий код


        // Отображаем в PictureBox картинку из БД
        private void datObjectsBindingSource_CurrentChanged(object sender, EventArgs e)
        {
            if (this.datObjectsBindingSource.Current == null)
            {
                pictureBox1.Image = null;
                return;
            }

            DataRowView drv = this.datObjectsBindingSource.Current as DataRowView;

            if (Convert.IsDBNull(drv["PHOTO"]))
            {
                pictureBox1.Image = null;
                return;
            }

            byte[] buf = (byte[])drv["PHOTO"];
            MemoryStream ms = new MemoryStream();
            
            try
            {
                ms.Write(buf, 0, buf.Length);
                pictureBox1.Image = Image.FromStream(ms);
            }
            catch
            {
            }
            finally
            {
                ms.Close();
            }
        }

        // Замена картинки пользователем и сохранение ее в датасет
        private void pictureBox1_Click(object sender, EventArgs e)
        {
            if (this.datObjectsBindingSource.Current == null)
                return;

            
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                pictureBox1.ImageLocation = openFileDialog1.FileName;
                FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open);
                byte[] buffer = new byte[Int16.MaxValue];
                MemoryStream ms = new MemoryStream();
                int n = 0;

                do
                {
                    n = fs.Read(buffer, 0, (int)Int16.MaxValue);
                    ms.Write(buffer, 0, n);

                }
                while (fs.Position != fs.Length);

                DataRowView drv = this.datObjectsBindingSource.Current as DataRowView;
                drv["PHOTO"] = ms.ToArray();

                fs.Close();
                ms.Close();
            }
        }

        // Удаление картинки
        private void button4_Click(object sender, EventArgs e)
        {
            pictureBox1.ImageLocation = "";
            if (this.datObjectsBindingSource.Current != null)
            {
                DataRowView drv = this.datObjectsBindingSource.Current as DataRowView;
                drv["PHOTO"] = null;
            }
        }



В итоге локальный датасет работает как надо, вроде...
Проблемы начинаются при попытке обновления данных в БД через TableAdapter

        private void fm_Main_FormClosed(object sender, FormClosedEventArgs e)
        {
            this.dat_ObjectsTableAdapter1.Update(IDS.dat_Objects.Select("", "", DataViewRowState.Deleted));
            this.dat_ObjectsTableAdapter1.Update(IDS.dat_Objects.Select("", "", DataViewRowState.ModifiedCurrent));

            // Здесь вылазит ошибка OleDbException "Не удается найти файл 'D:\Data\InvDB.mdb'". При этом была добавлена картинка 
            // из файла "D:\Data\1.jpg"
            // Сама база хранится в другом каталоге и ошибки нет, если в поле PHOTO ничего не записывать.
            this.dat_ObjectsTableAdapter1.Update(IDS.dat_Objects.Select("", "", DataViewRowState.Added));
        }


Помогите пожайлуйста...
Re: Сохранить изображение в MS Access
От: elvik Россия  
Дата: 20.10.06 09:21
Оценка:
Проблема решилась...
В ConnectionString адаптера надо указывать полный путь к mdb-файлу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.