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();