Не могу увидеть изображение при сохранении байтового массива как изображения с System.IO.FileStream - PullRequest
2 голосов
/ 13 декабря 2011

Я вытягиваю данные из поля изображения сервера MS SQL. Массив байтов формируется так:

public byte[] saveImageBlob(string number)
{
    string strSql = "select pic from emp where number like '" + number + "'";
    SqlCommand cmd = new SqlCommand(strSql, conn);
    SqlDataReader MyReader = cmd.ExecuteReader();

    if (MyReader.Read())
    {
        byte[] m_MyImage = (byte[])MyReader["pic"];
        return m_MyImage;
    }
    return null;
}

Затем я вызываю массив в моей функции page_load и помещаю его в файловый поток следующим образом

        Employee emp = new Employee();
        emp.getEmployee(Request.QueryString["user"]);
       string file_name = System.AppDomain.CurrentDomain.BaseDirectory + "/img/" + emp.Number.ToString() + ".bmp";

        System.IO.FileStream _FileStream = new System.IO.FileStream(file_name, System.IO.FileMode.Create, System.IO.FileAccess.Write);

        _FileStream.Write(emp.Picture, 0, emp.Picture.Length);

        _FileStream.Close();

Класс сотрудника делает только передачу данных между page_load и моим классом БД.

Файл сохраняется в нужном месте с правильным именем, и размер выглядит правильно. Но я не могу открыть его или посмотреть картинку. Файл поврежден.

Клиент сказал мне, что поле изображения на сервере sql содержит изображения BMP.

Я немного растерялся, кто-нибудь имел опыт работы с BLOB-объектами mssql?

Есть ли способ узнать, не повреждено ли поле изображения / блоб в БД?

Мне не хватает чего-то важного в моем коде?

С уважением, ССГ.

1 Ответ

3 голосов
/ 13 декабря 2011

Прежде всего, прекратите делать SQL-инъекцию в своем коде . Пожалуйста, остановитесь прямо сейчас, просмотрите весь ваш проект и замените все вхождения, где вы строите динамический SQL, соответствующими параметрами:

string strSql = "select pic from emp where number like @number";
SqlCommand cmd = new SqlCommand(strSql, conn);
cmd.Parameters.Add ("@number", SqlDbType.Varchar, 8000);
cmd.Parameters["@number"].Value = number;

Чтение Как код доступа к данным влияет на производительность базы данных о том, как правильно использовать параметры. Во-вторых, используйте правильные предикаты для поиска данных. Нет необходимости в LIKE. Используйте =:

 string strSql = "select pic from emp where number = @number";

Теперь ваш вопрос: почему вы сохраняете изображение для начала, почему бы не использовать изображение прямо из БД? См. Загрузка и выгрузка изображений с SQL Server через ASP.Net MVC , где приведен пример использования BLOB-объекта SQL Server в качестве хранилища для мультимедиа в режиме эффективной потоковой передачи без использования полного размера изображения в памяти. -array-copy размещения или промежуточные файлы.

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