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

相关文章

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

Mysql虚拟列的使用场景

《Mysql虚拟列的使用场景》MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧... 目录1. 介绍mysql虚拟列1.1 定义和作用1.2 虚拟列与普通列的区别2. MySQL虚拟列的类型2

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

mysql数据库分区的使用

《mysql数据库分区的使用》MySQL分区技术通过将大表分割成多个较小片段,提高查询性能、管理效率和数据存储效率,本文就来介绍一下mysql数据库分区的使用,感兴趣的可以了解一下... 目录【一】分区的基本概念【1】物理存储与逻辑分割【2】查询性能提升【3】数据管理与维护【4】扩展性与并行处理【二】分区的

MySQL中时区参数time_zone解读

《MySQL中时区参数time_zone解读》MySQL时区参数time_zone用于控制系统函数和字段的DEFAULTCURRENT_TIMESTAMP属性,修改时区可能会影响timestamp类型... 目录前言1.时区参数影响2.如何设置3.字段类型选择总结前言mysql 时区参数 time_zon

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ