2014-02-01 2 views
2

У меня есть база данных Access .mdb, и я хочу вставить изображение из приложения, разработанного на Visual C# 2010. Фотографии хранятся в базе данных в поле OLE -объект.Как вставить изображение в поле OLE доступа через .NET.

После добавления изображений непосредственно в Access они сохраняются в формате растрового изображения. Эти снимки можно открыть в Access с помощью двойного щелчка.

У меня есть следующий код:

OdbcConnection Connection = new OdbcConnection(); 
... 
sql = "INSERT INTO film (poster) VALUES (" ' " + Image.FromFile(textBox8.Text) + " ' ");"; 
//texbox are stored the picture name 
OdbcCommand Command = new OdbcCommand(sql, Connection); 
Command.ExecuteNonQuery(); 

код работает хорошо, но доступ сохраняет изображение как двоичные данные, и он не может быть открыт снова в Access. Скажите, как вставить изображение в растровое изображение. Благодарю.

ответ

3

Это несколько необычный запрос. Большинство пользователей, спрашивающих о вложенных изображениях OLE в Access, спрашивают о том, как их преобразовать от OLE-объекты в необработанные двоичные данные, а не наоборот. В текущих версиях Access есть такие функции, как элемент управления Image, который может отображать растровые изображения без необходимости усложнения обложек OLE, добавляемых к данным объекта.

Еще один способ сделать то, что вы просили. Он использует объект Access.Application, поэтому на нем должен быть установлен Access для работы. Он также требует формы внутри базы данных Access, где

  • сама форма связана с таблицей, содержащей поле изображения OLE вы хотите вставить,
  • единственный элемент управления на форме является Bound Object Frame, присоединенные к OLE.

PhotoForm.png

Пример кода также предполагает, что таблица обновляется имеет числовое поле первичного ключа с именем [ID].

private void button1_Click(object sender, EventArgs e) 
{ 
    // test data 
    int recordIdToUpdate = 15; 
    string bmpPath = @"C:\Users\Gord\Pictures\bmpMe.bmp"; 

    var paths = new System.Collections.Specialized.StringCollection(); 
    paths.Add(bmpPath); 
    Clipboard.SetFileDropList(paths); 

    // COM Reference required: 
    //  Microsoft Access 14.0 Object Library 
    var accApp = new Microsoft.Office.Interop.Access.Application(); 
    accApp.OpenCurrentDatabase(@"C:\Users\Public\Database1.accdb"); 
    accApp.DoCmd.OpenForm(
      "PhotoForm", 
      Microsoft.Office.Interop.Access.AcFormView.acNormal, 
      null, 
      "ID=" + recordIdToUpdate); 
    accApp.DoCmd.RunCommand(Microsoft.Office.Interop.Access.AcCommand.acCmdPaste); 
    accApp.DoCmd.Close(
      Microsoft.Office.Interop.Access.AcObjectType.acForm, 
      "PhotoForm", 
      Microsoft.Office.Interop.Access.AcCloseSave.acSaveNo); 
    accApp.CloseCurrentDatabase(); 
    accApp.Quit(); 
    this.Close(); 
} 
+1

я уже есть метод для получения изображения из оле-поданной в C# программы (пересекающей оле-заголовок), теперь мне нужен обратный метод. вы предложили очень интересный метод, но мне нужно сделать это только с инструментами C sharp без каких-либо изменений db. в любом случае, спасибо! – user3260339

+1

@ пользователь3260339 Как пожелаете. Имейте в виду, что форма доступа необязательно должна находиться в том же файле базы данных, что и обновляемая таблица. Он может быть в отдельном файле базы данных Access со связанной таблицей. Это будет работать так же хорошо. (На самом деле, потребуется, если файл базы данных, содержащий эту таблицу, был общим контентом в многопользовательской среде.) –

-2
private string ImageToBase64String(Image image) 
    { 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      image.Save(stream, image.RawFormat); 
      return Convert.ToBase64String(stream.ToArray()); 
     } 
    } 

    private void SaveButton() 
    { 

     string Pic = ImageToBase64String(PicBox.Image); 

     OleDbCommand PicSave = new OleDbCommand("INSERT INTO Picture(ID,PICTURE)VALUES(" + PicId.Text + ",'" + Pic + "')", con); 
     con.Open(); 
     var SaveValue = PicSave.ExecuteNonQuery(); 
     if (SaveValue > 0) 
     { 
      MessageBox.Show("Record Saved", "Information"); 
      ValueClear(); 
     } 
     else 
      MessageBox.Show("Rocord Not Saved", "Erro Msg"); 
     con.Close(); 
    } 
+0

100% обработанный код для вставки изображения в базу данных MS Access в поле OLE –

+0

Можете ли вы объяснить свой код? –

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