Я создаю первую таблицу данных для сохранения изображений в 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
Я думаю, что мой метод сохранения неправильный, пожалуйста, помогите
Ваш метод 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()
для вас.
((byte[])dgvDemo.CurrentRow.Cells[3].Value
Значение это значение, возвращаемоеimageToByteArray()
?