Сохранение и извлечение кода байта [] из нескольких изображений в сетке данных на SQL Server с использованием XML C #

1

Я создаю первую таблицу данных для сохранения изображений в datagridview.

 DataTable dt = new DataTable();
 dt.Columns.Add("Name", typeof(string));//0
 dt.Columns.Add("Upload", typeof(string));//1
 dt.Columns.Add("Show", typeof(string));//2
 dt.Columns.Add("image", typeof(byte[]));//3

 for (int i = 0; i < dgvDemo.RowCount-1; i++)
 {
            DataRow drOLD = dt.NewRow();
            drOLD["image"] =dgvDemo.Rows[i].Cells[3].Value;
            drOLD["Name"] = dgvDemo.Rows[i].Cells[0].Value;
            drOLD["Upload"] = "Upload";
            drOLD["Show"] = "Show";
            dt.Rows.Add(drOLD);
 }

 Image img = PBImage.Image; //Image.FromFile(@"physical path to the file");
 DataRow dr = dt.NewRow();
 dr["image"] = imageToByteArray(img);
 dr["Name"] = "Image";
 dr["Upload"] = "Upload";
 dr["Show"] = "Show";
 dt.Rows.Add(dr);

 dgvDemo.DataSource = dt;

 public byte[] imageToByteArray(System.Drawing.Image imageIn)
 {
        MemoryStream ms = new MemoryStream();
        imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
        return ms.ToArray();
 }

Это код, сохраняющий изображения в базе данных с использованием XML в качестве параметра хранимой процедуры

 hash = new Hashtable();
            hash.Add("@QueryNo", QueryNo);
            string strXmlCategory_Section = "";
            StringBuilder xmlClassMaster = new StringBuilder();
              for (int k = 0; k < dgvDemo.Rows.Count-1; k++)
                {
                    xmlClassMaster.Append("<Row>");
                    xmlClassMaster.Append("<Name>" + dgvDemo.Rows[k].Cells[0].Value + "</Name>");
                    xmlClassMaster.Append("<GridImage><cdata>" + ((byte[])dgvDemo.CurrentRow.Cells[3].Value) + "</cdata></GridImage>");
                    xmlClassMaster.Append("</Row>");
                }

                if (xmlClassMaster.Length > 0)
                {
                    xmlClassMaster.Append("</ImageInGrid>");
                    strXmlCategory_Section = "<ImageInGrid>" + Convert.ToString(xmlClassMaster);
                }
                hash.Add("@strImageInGrid", strXmlCategory_Section);

хэш-таблица передается в список параметров хранимой процедуре.

Код хранимой процедуры:

Exec sp_xml_prepareDocument @DocHandle_ImageInGrid output, @strImageInGrid

select Name, GridImage
        into #temp 
        from OPENXML (@DocHandle_ImageInGrid, '/ImageInGrid/Row',12)
        with (

                Name varchar(50) 'Name', 
                GridImage varbinary(max) 'GridImage'

             )

    insert into dbo.GridImage
        ( Name, GridImage)
    Select  Name, GridImage
    From #temp

У меня есть проблема с получением изображения из базы данных и его в Grid.

Ошибка

параметр недействителен. в system.drawing.image.fromstream

Я думаю, что мой метод сохранения неправильный, пожалуйста, помогите

  • 0
    Просто чтобы быть ясно, ((byte[])dgvDemo.CurrentRow.Cells[3].Value Значение это значение, возвращаемое imageToByteArray() ?
  • 0
    да.и это скрытое изображение в байтах
Теги:
datagridview

1 ответ

0
Лучший ответ

Ваш метод imageToByteArray() может возвращать байты с любым значением от 0 до 255. Вероятно, ваша база данных не поддерживает строки с такими полностью произвольными значениями символов. Предложите вместо этого преобразовать байты изображения в базу 64:

    public static string ToBase64String(this System.Drawing.Image imageIn)
    {
        if (imageIn == null)
            return null;
        ImageConverter converter = new ImageConverter();
        return Convert.ToBase64String((byte[])converter.ConvertTo(imageIn, typeof(byte[])));
    }

    public static Image FromBase64String(string imageString)
    {
        if (string.IsNullOrEmpty(imageString))
            return null;
        ImageConverter converter = new ImageConverter();
        return (Image)converter.ConvertFrom(Convert.FromBase64String(imageString));
    }

Я использовал ImageConverter потому что он сохраняет изображение в его текущем формате. Если вы хотите сохранить изображение в определенном формате - System.Drawing.Imaging.ImageFormat.Gif в вашем случае - ваш код верен.

Обновить

Похоже, вы делаете более фундаментальную ошибку. Когда вы это сделаете

var s = "<GridImage><cdata>" + ((byte[])dgvDemo.CurrentRow.Cells[3].Value) + "</cdata></GridImage>";

Вы в основном делаете

byte[] byteArray = (byte[])dgvDemo.CurrentRow.Cells[3].Value;
var s = "<GridImage><cdata>" + byteArray + "</cdata></GridImage>";

Чтобы выполнить это дополнение,.Net преобразует byteArray в строку, вызывая метод ToString() но этот метод не был переопределен в массивах и просто возвращает имя типа. Таким образом, вы получаете "<GridImage><cdata>System.Byte[]</cdata></GridImage>", что, безусловно, не то, что вы хотите. Вам нужно преобразовать массив байтов в строку явно, что для Convert.ToBase64String() и Convert.FromBase64String() для вас.

  • 0
    @Ranjeet - я не знаю, какой тип данных вы должны использовать в своей базе данных, я не администратор баз данных. Но если вы хотите, чтобы ваш XML содержал обычный ASCII, который может быть проанализирован любым, я рекомендую вам преобразовать ваш образ в кодировку base 64. Также смотрите обновление о более фундаментальной ошибке в вашем коде.
  • 0
    спасибо, сэр, я проверю и исправлю
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню