Spec-Zone .ru
спецификации, руководства, описания, API

21.2.5.10. Обработка Данных BLOB С Соединителем/Сетью

Одно обычное использование для MySQL является хранением двоичных данных в BLOB столбцы. MySQL поддерживает четыре различных типа данных BLOB: TINYBLOB, BLOB, MEDIUMBLOB, и LONGBLOB, все описанные в Разделе 11.4.3," BLOB и TEXT Типы" и Раздел 11.6, "Требования Хранения Типа данных".

Данные хранятся в a BLOB к столбцу можно получить доступ, используя Соединитель/Сеть и управлял клиентским кодом использования. Нет никаких особых требований для того, чтобы использовать Соединитель/Сеть с BLOB данные.

Простые примеры кода будут представлены в пределах этого раздела, и полный пример приложения может быть найден в Samples каталог установки Соединителя/Сети.

21.2.5.10.1. Подготовка MySQL Server

Первый шаг использует MySQL с BLOB данные должны сконфигурировать сервер. Давайте запустим, составляя таблицу, которая будет получена доступ. В моих таблицах файлов у меня обычно есть четыре столбца: AUTO_INCREMENT столбец соответствующего размера (UNSIGNED SMALLINT) служить первичным ключом, чтобы идентифицировать файл, a VARCHAR столбец, который хранит имя файла, UNSIGNED MEDIUMINT столбец, который хранит размер файла, и a MEDIUMBLOB столбец, который хранит файл непосредственно. Для этого примера я буду использовать следующее табличное определение:

CREATE TABLE file(file_id SMALLINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,file_name VARCHAR(64) NOT NULL,file_size MEDIUMINT UNSIGNED NOT NULL,file MEDIUMBLOB NOT NULL);

После составления таблицы Вы, возможно, должны были бы изменить max_allowed_packet системная переменная. Эта переменная определяет, как большой из пакета (то есть, единственная строка) может быть отправлен серверу MySQL. По умолчанию сервер только принимает максимальный размер 1 МБ из клиентского приложения. Если Вы намереваетесь превысить 1 МБ в своих передачах файлов, увеличьте это число.

max_allowed_packet опция может быть изменена, используя экран MySQL Workbench Server Administration. Скорректируйте Максимальную разрешенную опцию в Данных / раздел Емкости памяти вкладки Networking к соответствующей установке. После корректировки значения нажмите кнопку Apply и перезапустите сервер, используя Startup / Shutdown экран MySQL Workbench. Можно также скорректировать это значение непосредственно в my.cnf файл (добавляют строку, которая читает max_allowed_packet=xxM), или использование SET max_allowed_packet=xxM; синтаксис изнутри MySQL.

Попытайтесь быть консервативными, устанавливая max_allowed_packet, поскольку передачи данных BLOB могут занять время, чтобы завершиться. Попытайтесь установить значение, которое будет достаточно для Вашего намеченного использования и увеличит значение в случае необходимости.

21.2.5.10.2. Запись Файла к Базе данных

Чтобы записать файл в базу данных, мы должны преобразовать файл в байтовый массив, затем использовать байтовый массив в качестве параметра для INSERT запрос.

Следующий код открывает файл, используя объект FileStream, читает это в байтовый массив, и вставляет это в file таблица:

Пример Visual Basic
Dim conn As New MySqlConnectionDim cmd As New MySqlCommandDim SQL As StringDim FileSize As UInt32Dim rawData() As ByteDim fs As FileStreamconn.ConnectionString = "server=127.0.0.1;" _    & "uid=root;" _    & "pwd=12345;" _    & "database=test"Try    fs = New FileStream("c:\image.png", FileMode.Open, FileAccess.Read)    FileSize = fs.Length    rawData = New Byte(FileSize) {}    fs.Read(rawData, 0, FileSize)    fs.Close()    conn.Open()    SQL = "INSERT INTO file VALUES(NULL, @FileName, @FileSize, @File)"    cmd.Connection = conn    cmd.CommandText = SQL    cmd.Parameters.AddWithValue("@FileName", strFileName)    cmd.Parameters.AddWithValue("@FileSize", FileSize)    cmd.Parameters.AddWithValue("@File", rawData)    cmd.ExecuteNonQuery()    MessageBox.Show("File Inserted into database successfully!", _    "Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)    conn.Close()Catch ex As Exception    MessageBox.Show("There was an error: " & ex.Message, "Error", _        MessageBoxButtons.OK, MessageBoxIcon.Error)End Try
C# Пример
MySql.Data.MySqlClient.MySqlConnection conn;MySql.Data.MySqlClient.MySqlCommand cmd;conn = new MySql.Data.MySqlClient.MySqlConnection();cmd = new MySql.Data.MySqlClient.MySqlCommand();string SQL;UInt32 FileSize;byte[] rawData;FileStream fs;conn.ConnectionString = "server=127.0.0.1;uid=root;" +    "pwd=12345;database=test;";try{    fs = new FileStream(@"c:\image.png", FileMode.Open, FileAccess.Read);    FileSize = fs.Length;    rawData = new byte[FileSize];    fs.Read(rawData, 0, FileSize);    fs.Close();    conn.Open();    SQL = "INSERT INTO file VALUES(NULL, @FileName, @FileSize, @File)";    cmd.Connection = conn;    cmd.CommandText = SQL;    cmd.Parameters.AddWithValue("@FileName", strFileName);    cmd.Parameters.AddWithValue("@FileSize", FileSize);    cmd.Parameters.AddWithValue("@File", rawData);    cmd.ExecuteNonQuery();    MessageBox.Show("File Inserted into database successfully!",        "Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);    conn.Close();}catch (MySql.Data.MySqlClient.MySqlException ex){    MessageBox.Show("Error " + ex.Number + " has occurred: " + ex.Message,        "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);}

Read метод FileStream объект используется, чтобы загрузить файл в байтовый массив, который измеряется согласно Length свойство FileStream объект.

После присвоения байтового массива как параметр MySqlCommand объект, ExecuteNonQuery метод вызывают и BLOB вставляется в file таблица.

21.2.5.10.3. Чтение BLOB от Базы данных до Файла на Диске

Как только файл загружается в file таблица, мы можем использовать MySqlDataReader class, чтобы получить это.

Следующий код получает строку от file таблица, затем загружает данные в a FileStream объект, который будет записан диску:

Пример Visual Basic
Dim conn As New MySqlConnectionDim cmd As New MySqlCommandDim myData As MySqlDataReaderDim SQL As StringDim rawData() As ByteDim FileSize As UInt32Dim fs As FileStreamconn.ConnectionString = "server=127.0.0.1;" _    & "uid=root;" _    & "pwd=12345;" _    & "database=test"SQL = "SELECT file_name, file_size, file FROM file"Try    conn.Open()    cmd.Connection = conn    cmd.CommandText = SQL    myData = cmd.ExecuteReader    If Not myData.HasRows Then Throw New Exception("There are no BLOBs to save")    myData.Read()    FileSize = myData.GetUInt32(myData.GetOrdinal("file_size"))    rawData = New Byte(FileSize) {}    myData.GetBytes(myData.GetOrdinal("file"), 0, rawData, 0, FileSize)    fs = New FileStream("C:\newfile.png", FileMode.OpenOrCreate, FileAccess.Write)    fs.Write(rawData, 0, FileSize)    fs.Close()    MessageBox.Show("File successfully written to disk!", "Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)    myData.Close()    conn.Close()Catch ex As Exception    MessageBox.Show("There was an error: " & ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)End Try
C# Пример
MySql.Data.MySqlClient.MySqlConnection conn;MySql.Data.MySqlClient.MySqlCommand cmd;MySql.Data.MySqlClient.MySqlDataReader myData;conn = new MySql.Data.MySqlClient.MySqlConnection();cmd = new MySql.Data.MySqlClient.MySqlCommand();string SQL;UInt32 FileSize;byte[] rawData;FileStream fs;conn.ConnectionString = "server=127.0.0.1;uid=root;" +    "pwd=12345;database=test;";SQL = "SELECT file_name, file_size, file FROM file";try{    conn.Open();    cmd.Connection = conn;    cmd.CommandText = SQL;    myData = cmd.ExecuteReader();    if (! myData.HasRows)        throw new Exception("There are no BLOBs to save");    myData.Read();    FileSize = myData.GetUInt32(myData.GetOrdinal("file_size"));    rawData = new byte[FileSize];    myData.GetBytes(myData.GetOrdinal("file"), 0, rawData, 0, (int)FileSize);    fs = new FileStream(@"C:\newfile.png", FileMode.OpenOrCreate, FileAccess.Write);    fs.Write(rawData, 0, (int)FileSize);    fs.Close();    MessageBox.Show("File successfully written to disk!",        "Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);    myData.Close();    conn.Close();}catch (MySql.Data.MySqlClient.MySqlException ex){    MessageBox.Show("Error " + ex.Number + " has occurred: " + ex.Message,        "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);}

После соединения, содержания file таблица загружается в a MySqlDataReader объект. GetBytes метод MySqlDataReader используется, чтобы загрузиться BLOB в байтовый массив, который тогда пишется диску, используя a FileStream объект.

GetOrdinal метод MySqlDataReader может использоваться, чтобы решить, что целое число индексирует именованного столбца. Использование метода GetOrdinal предотвращает ошибки если порядок следования столбцов SELECT запрос изменяется.