Member 13336882 Ответов: 1

Не было найдено ни одного компонента визуализации, подходящего для выполнения этой операции.wpf C#


Я пытаюсь загрузить изображение из моей базы данных **.mdb** в WPF. Я использую этот код :


public void loadimg()
    {
        con.Open();
        OleDbCommand cmd = new OleDbCommand("Select * from recents", con);
        DataTable table = new DataTable;
        OleDbDataAdapter adap = new OleDbDataAdapter(cmd);
        adap.Fill(table);
        if (table.Rows.Count <= 0)
        {
            MsgBox("nooo");
        }
        else
        {
            MemoryStream stream = new MemoryStream();
            StreamWriter stm;
            BinaryWriter writer = new BinaryWriter(stream);
            int bufferSize = 100;
            byte[] outByte = new byte[bufferSize + 1];
            long retval;
            long startIndex = 0;
            string pubID = "";
            OleDbDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
            reader.Read();
            while (reader.Read())
            {
                startIndex = 0;
                retval = reader.GetBytes(1, startIndex, outByte, 0, bufferSize);
                while (retval == bufferSize)
                {
                    writer.Write(outByte);
                    writer.Flush();
                    startIndex += bufferSize;
                    retval = reader.GetBytes(1, startIndex, outByte, 0, bufferSize);
                }
    
                writer.Write(outByte, 0, (int)retval - 1);
                writer.Flush();
            }
    
            reader.Close();
            con.Close();
            stream.Position = 0;
            stream.Seek(0, SeekOrigin.Begin);
            System.Drawing.Image _Image = System.Drawing.Image.FromStream(stream);
            image1.Source = System.Windows.Media.Imaging.BitmapFrame.Create(stream);
        }
    }



Приведенный выше код возвращает ошибку :

> не было найдено ни одного компонента визуализации, подходящего для завершения этой операции.

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

Кстати,вот код, который я использовал для вставки данных :


public void adddata()
    {
    con.Open();
    OleDbCommand cmd = new OleDbCommand("Insert into   recents(Pic)values(@pic)", con);
    byte[] data;
    System.Drawing.Image myimage =  System.Drawing.Image.FromFile("E:\\19686468_1419770068104721_1127495277_o.png");
    using (MemoryStream ms = new MemoryStream())
    {
        myimage.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
        data = ms.ToArray();
    }

    cmd.Parameters.AddWithValue("@pic", data);
    cmd.ExecuteNonQuery();
    con.Close();
    }


Пожалуйста, помогите мне!

Что я уже пробовал:

Я перепробовал почти все решения, доступные в сети, но безрезультатно..Одно из решений, которое я не мог попробовать, состояло в том, чтобы преобразовать поток памяти в записываемое растровое изображение, так как я не могу получить сборку "System.windows.graphics"

Richard Deeming

Вы загружаете несколько изображений PNG из базы данных, добавляя их все в один поток, а затем пытаетесь загрузить объединенные изображения как одно изображение. Это никогда не сработает.

1 Ответов

Рейтинг:
2

phil.o

Просто дикие догадки, но вот несколько вещей, которые вы могли бы попробовать:

"Select * from recents"
Это не очень хорошая практика для использования SELECT * в запросе. Если вас интересует только Pic колонна из recents таблица, затем напишите
"SELECT Pic FROM recents"
Это будет намного чище, и легче читать и отлаживать.

reader.Read();
while (reader.Read()) { /* ... */ }

Когда вы делаете это, вы буквально читаете первую запись и немедленно отбрасываете ее. Просто написать
while (reader.Read()) { /* ... */ }


Другая проблема заключается в том, что вы никогда не избавляетесь от ресурсов потока, которые вы создаете. Это может привести к проблемам, когда к вашему методу обращаются несколько раз.
Например, когда вы создаете экземпляр потока, а не
MemoryStream ms = new MemoryStream();
// ...

писать
using (MemoryStream ms = new MemoryStream()) {
   // ...
}
Здесь я показываю вам пример для а MemoryStream объект, но это также означает другой объект, который реализует IDisposable интерфейс.
интерфейс IDisposable[^]

Еще одна (незначительная, неблокирующая) проблема заключается в том, как вы объявляете свой буфер:
byte[] outByte = new byte[bufferSize + 1];
Зачем давать вашему буферу на один элемент больше, чем ему действительно нужно?
byte[] outByte = new byte[bufferSize];
хватать.
То же самое происходит и в тот момент, когда вы выходите из цикла while. Вместо
writer.Write(outByte, 0, (int)retval - 1);
писать
if (retval > 0) { // If something remains to be written
   writer.Write(outByte, 0, (int)retval);
}


В качестве заключительного замечания я бы сказал, что ваша проблема, по-видимому, исходит из (Но это всего лишь предположение, поскольку вы не указали, какая линия вызывает ошибку) линии
image1.Source = System.Windows.Media.Imaging.BitmapFrame.Create(stream);
Не зная точного типа этого image1 переменная, я мог только догадываться о реальной проблеме. Пожалуйста, уточните, что это за тип image1 переменная.