[转帖]MySql Blob图片类型存储Bug解决:索引超出了数组界限错误_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2372 | 回复: 0   主题: [转帖]MySql Blob图片类型存储Bug解决:索引超出了数组界限错误        下一篇 
第五种族
注册用户
等级:列兵
经验:103
发帖:78
精华:0
注册:2011-11-3
状态:离线
发送短消息息给第五种族 加好友    发送短消息息给第五种族 发消息
发表于: IP:您无权察看 2014-11-14 11:04:20 | [全部帖] [楼主帖] 楼主

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

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

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论