Работа с 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 полета в повечето стандартни ситуации едва ли може да се нарече оправдана стъпка.