Работа с BLOB полета (MySQL, C#)
По принцип в стандартни ситуации съхраняването на картини в таблици в BLOB полета води до повече раздуване на обема на същите тези таблици. Ако говорим за съхраняване на текст в BLOB, това също е противоречиво предимство, тъй като ще е необходимо да конфигурирате търсенето в сайта по специален начин.
От гледна точка на PHP, в Интернет има много информация за работа с BLOB, извличане/зареждане на изображения и други подобни. Затова няма да засягаме този аспект.
Нещата са малко по-лоши с информация за работа с BLOB полета в C #, въпреки че всъщност няма нищо особено сложно в това, просто трябва компетентно да конвертирате двоични данни в желаното представяне и обратно (ако говорим за текст).
Например, прочетох BLOB полета с текст и ги показах в таблица, наречена DataGridViewString, по колони, използвайки следната конструкция (трябваше да видя текста и да направя промени в него, това е реална ситуация, задачата беше да напиша alt за снимки в база данни с 5000 продукта):
private DataTable data_bin;
частен MySqlDataAdapter da;
частен MySqlCommandBuilder cb;
// направи връзка с базата данни
data_bin = нова таблица с данни ();
da = нов MySqlDataAdapter(
"SELECT * FROM `myDataBase`.`products`", conn);
cb = нов MySqlCommandBuilder(da);
DataColumn column0 = data_bin.Columns.Add("име(низ)", typeof(низ));
foreach(DataRow редове в data_bin.Rows)
DataColumn column1 = data_bin.Columns.Add("картина(низ)", typeof(низ));
foreach(DataRow редове в data_bin.Rows)
Принципът на работа на този код е доста прост, тоест към таблицата с двоични данни се добавят нови колони, в които се записват вече преобразуваните в текст, а двоичните се изтриват.
Запис в BLOBполетата се произвеждат по един от начините, описани в предишния отговор, с единствената разлика, че трябва да поставите двоични данни. Обратната трансформация, мисля, че няма да предизвика въпроси, описана е във всеки справочник:
byte[] name1 = Encoding.UTF8.GetBytes(dataGridViewString.Rows[i].Cells[1].Value.ToString().Trim());
Ако говорим за импортиране/експортиране на изображения от/в BLOB, тогава за първия случай (импортиране) ще трансформираме леко предишния код, а именно ще вземем полетата с имената на статиите от таблицата на базата данни, ще прочетем изображенията в буфера, ще създадем поток и ще запазим нашите изображения във файлове с разширение jpg:
data_bin = нова таблица с данни ();
da = нов MySqlDataAdapter(
"ИЗБЕРЕТЕ `име`,`снимка` ОТ `myDataBase`.`продукти`", conn);
cb = нов MySqlCommandBuilder(da);
foreach(DataRow редове в data_bin.Rows)
string str = "C:\\"+Encoding.UTF8.GetString((byte[])rows["name"])+".jpg";
byte[] Img = (byte[])редове["картина"];
FileStream fs = нов FileStream(str, FileMode.CreateNew, FileAccess.Write);
fs.Write(Img, 0, Img.Length);
Този код представлява най-простия случай и предполага, че всички файлове с изображения са Jpegs по подразбиране. В по-сложни ситуации трябва да използвате библиотеката Image.Drawing, за да конвертирате двоични данни в изображения. И тази опция ще се окаже най-добрата, тъй като има метод за запазване с принудително преобразуване в даден формат, например за нашия случай:
Изображение image1 = ново растерно изображение (нов MemoryStream((byte[])редове["картина"]);
Всъщност може да има доста опции, така че експериментирайте. Същността е ясна - четем данни в byte[ buffer], създаваме поток (например MemoryStream), записваме данни от буфера в потока, след коетодестилираме данните в желания клас за работа с изображения, конвертираме ги в желания формат и ги запазваме.
Що се отнася до четенето на файлове и преобразуването им в двоична форма, тогава има обратно движение. В този случай ще покажа една доста стандартна функция.
байт[] ReadImageToBytes(низ sPath)
байт [] данни = нула;
//FileInfo за получаване на размера на файла
FileInfo fInfo = нов FileInfo(sPath);
long numBytes = fInfo.Length;
//Отворете FileStream, за да прочетете файла
FileStream fStream = нов FileStream(sPath, FileMode.Open, FileAccess.Read);
//Използване на BinaryReader и четене на данни в буфер byte[].
BinaryReader br = нов двоичен четец(fStream);
Но като цяло използването на BLOB полета в повечето стандартни ситуации едва ли може да се нарече оправдана стъпка.