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

相关文章

SQL server数据库如何下载和安装

《SQLserver数据库如何下载和安装》本文指导如何下载安装SQLServer2022评估版及SSMS工具,涵盖安装配置、连接字符串设置、C#连接数据库方法和安全注意事项,如混合验证、参数化查... 目录第一步:打开官网下载对应文件第二步:程序安装配置第三部:安装工具SQL Server Manageme

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

浅谈mysql的not exists走不走索引

《浅谈mysql的notexists走不走索引》在MySQL中,​NOTEXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引,下面就来介绍一下mysql的notexists走不走索... 在mysql中,​NOT EXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引。以下

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构