SqlDataReader: считывает varbinary в байтовый массив

У меня есть таблица SQL Server с varbinary(max) колонка. Я использую его для хранения изображений в нем. Изображения выбираются с OpenFileDialogв переводе на byte[] как это

public byte[] ConvertImageToByteArray(String filepath)
{
    try
    {
        return File.ReadAllBytes(filepath);
    }
    catch (Exception) 
    {
        throw; 
    }
}

и затем сохраняется в базе данных с помощью этой строки кода:

sqlCmd.Parameters.Add("@image", SqlDbType.VarBinary).Value = image;

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

введите описание изображения здесь

К сожалению, я не могу загрузить изображения обратно из таблицы данных.

Я использую SqlDataReader сделать так:

DbSql db = new DbSql();

SqlDataReader dr = db.GetDataReader(sqlCmd);

if (dr.Read())
{
    if (!dr.IsDBNull(1))
        productName = dr.GetString(1);

    if (!dr.IsDBNull(2))
        identNumber = dr.GetString(2);

    [...]

    if (!dr.IsDBNull(23))
        comment = dr.GetString(23);

    if (!dr.IsDBNull(24))
    {
        byte[] image = dr.GetSqlBytes(24).Value;  // <- This is where I try to grab the image
    }
}

Кажется, я не могу создать правильное byte[] с

image = dr.GetSqlBytes(24).Value;

потому что мой следующий шаг не сможет снова превратить его в изображение:

public Image ConvertImageFromByteArray(byte[] array)
{
        try
        {
            MemoryStream ms = new MemoryStream(array);
            return Image.FromStream(ms);
        }
        catch (Exception) { throw; }
    }

РЕДАКТИРОВАТЬ: при попытке что-то вроде pictureBox.Image = ConvertImageFromByteArray(image)Я получаю сообщение об ошибке "Неверный параметр" (сам переводится как "Ungültiger Parameter" на немецком языке) введите описание изображения здесь

Кто-нибудь может предложить решение?

1 ответ

Решение

Как только вы приведете свой varbinary(MAX) к байтовому массиву

image = (byte[])dr[24];

Попробуй это..

    MemoryStream ms = new MemoryStream(image);
    imagePictureBox.Image = System.Drawing.Image.FromStream(ms);

Вот так я создаю байтовый массив...

    if (File.Exists(sLogoName) == false)
       throw new Exception("File Not Found: " + sLogoName);
    FileStream sourceStream = new FileStream(sLogoName, FileMode.Open, FileAccess.Read);
    int streamLength = (int)sourceStream.Length;
    Byte[] byLogo = new Byte[streamLength];
    sourceStream.Read(byLogo, 0, streamLength);
    sourceStream.Close();
Другие вопросы по тегам