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

相关文章

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

mysql索引四(组合索引)

单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引;组合索引,即一个索引包含多个列。 因为有事,下面内容全部转自:https://www.cnblogs.com/farmer-cabbage/p/5793589.html 为了形象地对比单列索引和组合索引,为表添加多个字段:    CREATE TABLE mytable( ID INT NOT NULL, use

mysql索引三(全文索引)

前面分别介绍了mysql索引一(普通索引)、mysql索引二(唯一索引)。 本文学习mysql全文索引。 全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用【分词技术】等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。 在MySql中,创建全文索引相对比较简单。例如:我们有一个文章表(article),其中有主键ID(

mysql索引二(唯一索引)

前文中介绍了MySQL中普通索引用法,和没有索引的区别。mysql索引一(普通索引) 下面学习一下唯一索引。 创建唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现重复。唯一索引可以有多个但索引列的值必须唯一,索引列的值允许有空值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该使用关键字UNIQUE,把它定义为一个唯一索引。 添加数据库唯一索引的几种

mysql索引一(普通索引)

mysql的索引分为两大类,聚簇索引、非聚簇索引。聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引则不同。聚簇索引能够提高多行检索的速度、非聚簇索引则对单行检索的速度很快。         在这两大类的索引类型下,还可以降索引分为4个小类型:         1,普通索引:最基本的索引,没有任何限制,是我们经常使用到的索引。         2,唯一索引:与普通索引