视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
MySqlBlob图片类型存储Bug解决:索引超出了数组界限错误_MySQL
2020-11-09 19:23:01 责编:小采
文档


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


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

原文地址:http://www.cyqdata.com/cyq1162/article-detail-54329

下载本文
显示全文
专题