MySql Blob图片类型存储Bug解决:索引超出了数组界限错误

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

告别了一周多的网络,终于回归,突见群里,有网友提了以下问题:


CYQ.Data框架测试:mysql数据库测试(保存blob类型的数据会出问题) ,针对mysql数据库做测试:发现更新blog字段,总是保存System.Byte[]

 

既然网友提出了问题,本地再试验一下:

先在本地装了个Mysql,又装了个navicat管理工具,又新建了个工程来测试:
简单的测试方法,就是放一个按钮,点击一下,读取远程图片,然后存到数据库,再读取出来显示到界面上。
管理工具随意建了个表“D1”,弄了三个id,img,name三个字段。


示例代码如下,因为测试,代码就没写的太规范:

复制代码
protected  void btnTest_Click( object sender, EventArgs e)
    {
         string url =  " http://www.baidu.com/img/baidu_jgylogo3.gif ";
         bool result =  false;
         int id =  0;
        string conn =  " host=127.0.0.1;Port=3306;Database=test;uid=root;pwd=123456 ";
        //   string conn = "server=.;database=demo;uid=sa;pwd=123456";
         using (MAction action =  new MAction( " d1 ", conn))
        {
            WebClient wc =  new WebClient();
             try
            {
                 // if (action.Fill(2))
                
// {
                     byte[] data = wc.DownloadData(url);
                    action.Set( " img ", data);
                    action.Set( " name "" ldf ");
                    result = action.Insert(InsertOp.ID);
                    id = action.Get< int>( " id ");
                 // }
            }
             catch (Exception err)
            {
                Log.WriteLogToTxt(err);
            }
        }
         if (result) // 再开一个读取试试
        {
             using (MAction action =  new MAction( " d1 ", conn))
            {
                 if (action.Fill(id))
                {
                    Response.BinaryWrite(action.Get< byte[]>( " img "));
                }
            }
        }
}
复制代码

 

解决与调试经过:

经本地测试,调试,发现对blob类型的参数赋值时,抛出异常:索引超出了数组界限。
异常太迷惑,网上搜了一下,有人说是:Mysql.dll的版本问题,花了一个csdn积分下了一个6. 2.3版本,还是不顶用。 
然后无意识的进行调试,估计运气问题,竟然让我发现了问题所在,只能说是运气好。


看一段小代码,对参数的赋值,参数多数据库支持时,类似这种写法:

复制代码
 DbParameter para = _fac.CreateParameter();//通过工厂广告获得当前数据库类型的参数
            para.ParameterName = parameterName;
            para.Value = value == null ? DBNull.Value : value;
            para.DbType = dbType;

            if (size > -1)//设定长度。
            {
               para.Size = size;
            }
            para.Direction = direction;
复制代码
 

这代码其实很简单:

产生了一个参数,然后赋参数名,参数值,参数类型,参数大小和参数指向。
而Mysql竟然在对参数Size赋值的问题处理上有些Bug。


当我调试跳过对para.Size赋值时,竟然正常了。

于是代码改成了这样:

if (dbType != DbType.Binary && size > - 1) // mysql不能设定长度,否则会报索引超出了数组界限错误。


然后我测试了下其它数据库,发现指定size是正常的,最后得出一结论:

经过测试,其它数据库类型对Size的赋值是正常的,唯Mysql有问题,为此,在编写进行多数据库支持的框架时,总会时不时的遇到好多问题,别纠结,始终要解决。

 


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
9月前
|
SQL 存储 大数据
案例12-数据类型不一致导致索引失效
数据类型不一致导致索引失效
|
9月前
|
存储 关系型数据库 MySQL
28个案例问题分析---012---数据库数据类型问题--Mysql数据类型,索引失效
28个案例问题分析---012---数据库数据类型问题--Mysql数据类型,索引失效
68 0
|
存储 数据库
长整数在插入较短的列时会被转换,但不会被截断为什么?公式是什么?
长整数在插入较短的列时会被转换,但不会被截断为什么?公式是什么?
|
数据库
Oralce数据库数据转存保证序列一致(自增类型字段续接)
Oralce数据库数据转存保证序列一致(自增类型字段续接)
Oralce数据库数据转存保证序列一致(自增类型字段续接)
|
存储 数据库
数据库中某一列中使用的是text存储,使用的是逗号分割,查询某一个数据在该列所有数据中的条数【真实场景】
数据库中某一列中使用的是text存储,使用的是逗号分割,查询某一个数据在该列所有数据中的条数【真实场景】
66 0
|
存储 关系型数据库 MySQL
软件测试mysql面试题:BYTE数据字段中可以存储的最大值是多少?
软件测试mysql面试题:BYTE数据字段中可以存储的最大值是多少?
220 0
|
关系型数据库 MySQL 数据库
mysql:你可以用什么来确保表格里的字段只接受特定范围里的值?
mysql:你可以用什么来确保表格里的字段只接受特定范围里的值?
140 0
|
数据库 SQL
查看数据库表的数据量和SIZE大小的脚本修正
原文:查看数据库表的数据量和SIZE大小的脚本修正 在使用桦仔的分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)的脚本时,遇到下面一些错误 这个是因为这些表的Schema是Maint,而不是默认的dbo,造成下面这段SQL在执行EXEC sp_spaceus...
806 0