Home >Database >Mysql Tutorial >MySql Blob图片类型存储Bug解决:索引超出了数组界限错误_MySQL

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

WBOY
WBOYOriginal
2016-06-01 13:11:50903browse

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


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( " id ");
                 // }
            }
             catch (Exception err)
            {
                Log.WriteLogToTxt(err);
            }
        }
         if (result) // 再开一个读取试试
        {
             using (MAction action =  new MAction( " d1 ", conn))
            {
                 if (action.Fill(id))
                {
                    Response.BinaryWrite(action.Get( " 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://www.cyqdata.com/cyq1162/article-detail-54329 

 

 

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn