MySQL学习——在用Connector/NET处理BLOB数据

2024-06-13 10:20

本文主要是介绍MySQL学习——在用Connector/NET处理BLOB数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MySQL的一个常见用途是将二进制数据存储在BLOB列中。MySQL支持四种不同的BLOB数据类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB,所有这些都在BLOB and TEXT Types和 Data Type Storage Requirements中进行了描述。

存储在BLOB列中的数据可以使用MySQL Connector/NET进行访问,并使用客户端代码进行操作。将Connector/NET与BLOB数据一起使用没有特殊要求。

1 准备MySQL服务器

使用MySQL和BLOB数据的第一步是配置服务器。首先,创建一个可以访问的表。文件表通常有四列:

  • 适当大小的AUTO_INCREMENT列(UNSIGNED SMALLINT)用作标识文件的主键,
  • 存储文件名的VARCHAR列,
  • 存储文件大小的UNSIGNED MEDIUMINT列,
  • 存储文件本身的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服务器的大小。默认情况下,服务器只接受客户端应用程序的最大为1MB的数据包。如果您打算在文件传输中超过1MB,请增加这个数字。

max_allowed_packet选项可以使用MySQL Workbench服务器管理界面进行修改。将“网络”选项卡的“Data / Memory size”部分中的“允许的最大值”选项调整为适当的设置。调整值后,单击Apply按钮,然后使用MySQL Workbench的Startup/Shutdown屏幕重新启动服务器。您也可以直接在my.cnf文件中调整此值(添加一行读取max_allowed_packet=xxM),或使用SET max_allowed _packet=xxM;MySQL中的语法。

设置max_allowed_packet时尽量保守,因为BLOB数据的传输可能需要一些时间才能完成。尝试设置一个适合您预期用途的值,并在必要时增加该值。

2 将文件写入数据库

要将文件写入数据库,我们需要将文件转换为字节数组,然后将字节数组用作INSERT查询的参数。

以下代码使用FileStream对象打开一个文件,将其读取到字节数组中,并将其插入到文件表中:

C# Code Example
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);
}

Visual Basic Code Example

Dim conn As New MySqlConnection
Dim cmd As New MySqlCommandDim SQL As StringDim FileSize As UInt32
Dim rawData() As Byte
Dim fs As FileStreamconn.ConnectionString = "server=127.0.0.1;" _& "uid=root;" _& "pwd=12345;" _& "database=test"Tryfs = New FileStream("c:\image.png", FileMode.Open, FileAccess.Read)FileSize = fs.LengthrawData = New Byte(FileSize) {}fs.Read(rawData, 0, FileSize)fs.Close()conn.Open()SQL = "INSERT INTO file VALUES(NULL, @FileName, @FileSize, @File)"cmd.Connection = conncmd.CommandText = SQLcmd.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 ExceptionMessageBox.Show("There was an error: " & ex.Message, "Error", _MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try

FileStream对象的Read方法用于将文件加载到一个字节数组中,该数组的大小根据FileStream对象的Length属性而定。

将字节数组指定为MySqlCommand对象的参数后,将调用ExecuteNonQuery方法,并将BLOB插入到文件表中。

3 将BLOB从数据库读取到磁盘上的文件

将文件加载到文件表中后,我们可以使用MySqlDataReader类来检索它。

以下代码从文件表中检索一行,然后将数据加载到要写入磁盘的FileStream对象中:

C# Code Example
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);
}

Visual Basic Code Example

Dim conn As New MySqlConnection
Dim cmd As New MySqlCommand
Dim myData As MySqlDataReader
Dim SQL As String
Dim rawData() As Byte
Dim FileSize As UInt32
Dim fs As FileStreamconn.ConnectionString = "server=127.0.0.1;" _& "uid=root;" _& "pwd=12345;" _& "database=test"SQL = "SELECT file_name, file_size, file FROM file"Tryconn.Open()cmd.Connection = conncmd.CommandText = SQLmyData = cmd.ExecuteReaderIf 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 ExceptionMessageBox.Show("There was an error: " & ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try

连接后,文件表的内容将加载到MySqlDataReader对象中。MySqlDataReader的GetBytes方法用于将BLOB加载到字节数组中,然后使用FileStream对象将其写入磁盘。

MySqlDataReader的GetOrdinal方法可用于确定命名列的整数索引。如果SELECT查询的列顺序发生更改,则使用GetOrdinal方法可以防止出现错误。

这篇关于MySQL学习——在用Connector/NET处理BLOB数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1057026

相关文章

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

SQL BETWEEN 的常见用法小结

《SQLBETWEEN的常见用法小结》BETWEEN操作符是SQL中非常有用的工具,它允许你快速选取某个范围内的值,本文给大家介绍SQLBETWEEN的常见用法,感兴趣的朋友一起看看吧... 在SQL中,BETWEEN是一个操作符,用于选取介于两个值之间的数据。它包含这两个边界值。BETWEEN操作符常用

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

MySql match against工具详细用法

《MySqlmatchagainst工具详细用法》在MySQL中,MATCH……AGAINST是全文索引(Full-Textindex)的查询语法,它允许你对文本进行高效的全文搜素,支持自然语言搜... 目录一、全文索引的基本概念二、创建全文索引三、自然语言搜索四、布尔搜索五、相关性排序六、全文索引的限制七

Python处理函数调用超时的四种方法

《Python处理函数调用超时的四种方法》在实际开发过程中,我们可能会遇到一些场景,需要对函数的执行时间进行限制,例如,当一个函数执行时间过长时,可能会导致程序卡顿、资源占用过高,因此,在某些情况下,... 目录前言func-timeout1. 安装 func-timeout2. 基本用法自定义进程subp

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

数据库面试必备之MySQL中的乐观锁与悲观锁

《数据库面试必备之MySQL中的乐观锁与悲观锁》:本文主要介绍数据库面试必备之MySQL中乐观锁与悲观锁的相关资料,乐观锁适用于读多写少的场景,通过版本号检查避免冲突,而悲观锁适用于写多读少且对数... 目录一、引言二、乐观锁(一)原理(二)应用场景(三)示例代码三、悲观锁(一)原理(二)应用场景(三)示例

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景