Здравствуйте, уважаемые.
Пишу приложение на 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));
}
Помогите пожайлуйста...
Проблема решилась...
В ConnectionString адаптера надо указывать полный путь к mdb-файлу