博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySql Blob图片类型存储Bug解决:索引超出了数组界限错误
阅读量:6412 次
发布时间:2019-06-23

本文共 1807 字,大约阅读时间需要 6 分钟。

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

框架测试: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有问题,为此,在编写进行多数据库支持的框架时,总会时不时的遇到好多问题,别纠结,始终要解决。

 

转载地址:http://mgkra.baihongyu.com/

你可能感兴趣的文章
go语言与java nio通信,解析命令调用上下文拉起ffmpeg,并引入livego做的简单流媒体服务器...
查看>>
JavaScript面向对象轻松入门之多态(demo by ES5、ES6、TypeScript)
查看>>
【数据结构】线性表(一):顺序列表
查看>>
利用Mallet工具自动挖掘文本Topic
查看>>
Windows下oracle打补丁步骤
查看>>
Python教程(一)Python简介
查看>>
asp.net forms认证
查看>>
Hadoop 公平调度器算法调度解析
查看>>
Linux Foundation(笔记)
查看>>
Java学习第二十五天
查看>>
vim配置
查看>>
ubuntu 把软件源修改为国内源和更新
查看>>
随机产生四则运算,导入导出文件
查看>>
位运算符
查看>>
winform自定义控件
查看>>
C#编码好习惯
查看>>
避其锋芒,侧翼出击。——司马亮创业回忆录(一)
查看>>
scope
查看>>
一起谈.NET技术,晚绑定场景下对象属性赋值和取值可以不需要PropertyInfo
查看>>
一起谈.NET技术,.Net Framework源代码中的模式之Prototype(原型模式)
查看>>