Spec-Zone .ru
спецификации, руководства, описания, API
|
Одно обычное использование для MySQL является хранением двоичных данных в BLOB
столбцы. MySQL поддерживает четыре различных типа данных BLOB: TINYBLOB
, BLOB
, MEDIUMBLOB
,
и LONGBLOB
, все описанные в Разделе
11.4.3," BLOB
и TEXT
Типы" и Раздел
11.6, "Требования Хранения Типа данных".
Данные хранятся в a BLOB
к столбцу можно получить доступ, используя
Соединитель/Сеть и управлял клиентским кодом использования. Нет никаких особых требований для того, чтобы
использовать Соединитель/Сеть с BLOB
данные.
Простые примеры кода будут представлены в пределах этого раздела, и полный пример приложения может быть найден в
Samples
каталог установки Соединителя/Сети.
Первый шаг использует 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 к соответствующей установке. После корректировки значения нажмите кнопку
и перезапустите сервер, используя Startup / Shutdown
экран MySQL Workbench.
Можно также скорректировать это значение непосредственно в my.cnf
файл
(добавляют строку, которая читает max_allowed_packet=
), или использование xx
MSET
max_allowed_packet=
синтаксис изнутри MySQL. xx
M;
Попытайтесь быть консервативными, устанавливая max_allowed_packet
, поскольку
передачи данных BLOB могут занять время, чтобы завершиться. Попытайтесь установить значение, которое будет
достаточно для Вашего намеченного использования и увеличит значение в случае необходимости.
Чтобы записать файл в базу данных, мы должны преобразовать файл в байтовый массив, затем использовать
байтовый массив в качестве параметра для INSERT
запрос.
Следующий код открывает файл, используя объект FileStream, читает это в байтовый массив, и вставляет это в
file
таблица:
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
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
таблица.
Как только файл загружается в file
таблица, мы можем использовать MySqlDataReader
class, чтобы получить это.
Следующий код получает строку от file
таблица, затем загружает данные в a FileStream
объект, который будет записан диску:
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
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
запрос изменяется.