Как использовать тип данных вложения базы данных Microsoft Access? - PullRequest
2 голосов
/ 26 июня 2011

Я пытаюсь использовать тип данных вложения базы данных Microsoft Access.но я не знаю, как его использовать.

Я хочу вставить изображение в базу данных доступа с помощью .Net Windows Form.

В SQL Server 2008 образ данных и байт совместимы для этого,но я не знаю, как вставить изображение в базу данных доступа.

, если необходимо изменить байт, как SQL Server, или можно напрямую вставить в базу данных доступа.

Ответы [ 2 ]

2 голосов
/ 26 июня 2011
using (var connection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\BlankDatabase.mdb"))
{
    connection.Open();

    // Create table
    using (var command = connection.CreateCommand())
    {
        command.CommandText = @"
            CREATE TABLE FileTable (
                FileName VARCHAR(255),
                File IMAGE)
            ";
        command.ExecuteNonQuery();
    }

    var imageContent = File.ReadAllBytes(@"C:\logo.png");

    // upload image to the table
    using (var command = connection.CreateCommand())
    {
        command.CommandText = @"
            INSERT INTO FileTable (FileName, File)
            VALUES (@FileName, @File)
            ";
        command.Parameters.AddWithValue("@FileName", "Logo");
        command.Parameters.AddWithValue("@File", imageContent);
        command.ExecuteNonQuery();
    }

    // retreive image from the table
    using (var command = connection.CreateCommand())
    {
        command.CommandText = @"
            SELECT File
            FROM FileTable
            WHERE FileName = 'Logo'
            ";
        var readImageContent = (byte[])command.ExecuteScalar();
        File.WriteAllBytes(@"C:\logo1.png", readImageContent);
    }

    // alter image from the table
    using (var command = connection.CreateCommand())
    {
        command.CommandText = @"
            UPDATE FileTable
            SET File = @File
            WHERE FileName = 'Logo'
            ";
        command.Parameters.AddWithValue("@File", imageContent);
        command.ExecuteNonQuery();
    }

    // delete image from the table
    using (var command = connection.CreateCommand())
    {
        command.CommandText = @"
            DELETE FROM FileTable
            WHERE FileName = 'Logo'
            ";
        command.ExecuteNonQuery();
    }
}

В этом коде BlankDatabase.mdb является пустым файлом базы данных MS Access.

[Изменить]

Когда вы сохранили изображение в базе данных, каккак показано выше, вы можете получить байты изображения, как показано выше:

Вы можете создать Image из байтов изображения, например:

var imageConverter = new ImageConverter();
pictureBox1.Image = (Image)imageConverter.ConvertFrom(fileContent);
1 голос
/ 08 августа 2012

Вот то, что я использую, чтобы получить вложения файлов из подключения OleDB в коде .net к базе данных Microsoft Access с типами полей вложений:

Этот метод получает нужный файл из Порядкового положения из вложенияимя поля "Pic" в моей таблице ... вы можете хранить много файлов в поле вложения, поэтому вам нужно указать, какие из файлов вы хотите .. надеюсь, это поможет (я использую это как веб-URL, чтобы взять изображение из вложенияполе в базе данных доступа, но вызовы COM будут такими же в вашем приложении winform) .. удачи

        try
            {
                  //You get your file in a byteArray fileType is just the ordinal file position in the fileattachment field..ex. 1, 2, 3 (shown in the access listbox)
                Response.BinaryWrite(GetPicField(productID, fileType));
                Response.ContentType = "image/bmp";
            }

            catch 
            {
                //need to get missing product photo image here as well N/A
                Response.BinaryWrite(GetNA_Image());
                Response.ContentType = "image/bmp";
            }

    //getting from Database
    private byte[] GetPicField(string productID,int fileToShow)
    {
        DBEngine dbe = new DBEngine();
        Database db;
        Recordset rs;

        byte[] byteArray = null;

        dbe = new DBEngine();
        db = dbe.OpenDatabase(Application["DB_FileName"].ToString());
        rs = db.OpenRecordset("SELECT PIC FROM PRODUCT WHERE PRODUCTID = " + productID, RecordsetTypeEnum.dbOpenForwardOnly, 0, LockTypeEnum.dbPessimistic);

        if (rs.RecordCount > 0)
        {

            Recordset rs2 = (Recordset2)rs.Fields["Pic"].Value;
            int i = 1;

            while (i < fileToShow)
            {
                rs2.MoveNext();
                i++;
            }

          //get the thubmnail
           Field2 f2 = (Field2)rs2.Fields["FileData"]; //0 is first pic

            byteArray = f2.GetChunk(20, f2.FieldSize - 20);

            System.Runtime.InteropServices.Marshal.ReleaseComObject(f2);
            rs2.Close();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(rs2);
            f2 = null;
            rs2 = null;

        }

        rs.Close();
        db.Close();

        System.Runtime.InteropServices.Marshal.ReleaseComObject(rs);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(dbe);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(db);

        rs = null;
        db = null;
        dbe = null;

        return byteArray;

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...