您好,欢迎访问一九零五行业门户网

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

告别了一周多的网络,终于回归,突见群里,有网友提了以下问题:
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
其它类似信息

推荐信息