MySql Blob图片类型存储Bug解决:索引超出了数组界限错误
2023-09-14 08:59:38 时间
CYQ.Data框架测试:mysql数据库测试(保存blob类型的数据会出问题) ,针对mysql数据库做测试:发现更新blog字段,总是保存System.Byte[]
先在本地装了个Mysql,又装了个navicat管理工具,又新建了个工程来测试:
简单的测试方法,就是放一个按钮,点击一下,读取远程图片,然后存到数据库,再读取出来显示到界面上。
管理工具随意建了个表“D1”,弄了三个id,img,name三个字段。
{
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"));
}
}
}
异常太迷惑,网上搜了一下,有人说是: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。
if (dbType != DbType.Binary size -1)//mysql不能设定长度,否则会报索引超出了数组界限错误。
MySQL特性 - 表属性上的表达式 - 如何计算和存储 MySQL从5.7版本开始支持Generated Column, 并在最近的8.0版本中支持了Functional index, 这两个特性都通过创建使用表达式进行描述的列来实现的。笔者之前满好奇这些表达式信息都是怎么存储的,本文主要记录了涉及到的相关函数,主要是做个笔记,不会深入解读。
先在本地装了个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有问题,为此,在编写进行多数据库支持的框架时,总会时不时的遇到好多问题,别纠结,始终要解决。
MySQL特性 - 表属性上的表达式 - 如何计算和存储 MySQL从5.7版本开始支持Generated Column, 并在最近的8.0版本中支持了Functional index, 这两个特性都通过创建使用表达式进行描述的列来实现的。笔者之前满好奇这些表达式信息都是怎么存储的,本文主要记录了涉及到的相关函数,主要是做个笔记,不会深入解读。
相关文章
- 故障分析 | 从一则错误日志到 MySQL 认证机制与 bug 的深入分析
- MySQL数据行复制:一步步指南(mysql复制数据行)
- MySQL 无法重装的困扰(mysql重装不了)
- 实战MySQL:启动脚本掌握要领(mysql的启动脚本)
- MySQL分页技巧:熟练实现分页语句(mysql分页语句)
- MySQL数据库错误1064解决方法(mysql错误1064)
- 解决MySQL错误1067问题(mysql错误1067)
- MySQL服务连接错误10061:解决方法指南(mysql事件10061)
- MySQL创建表出现错误的解决方案(mysql创建表错误)
- 轻松实现MySql数据源连接(数据源连接mysql)
- MySQL使用详解:全面学习MYSQL技术(mysql大全)
- MySQL如何取出字段值?(mysql取字段值)
- MySQL数据库技术:简单介绍(mysql数据库技术简介)
- MySQL中使用FOR循环快速编写函数(mysql函数for)
- 如何使用C语言操作MySQL数据库(c mysql步骤)
- CMS极速打开MySQL数据库大门(cms打开mysql)
- MySQL数据迁移到Oracle挑战与机遇(mysql倒oracle)
- 数据库如何利用CMD命令查询MySQL数据库(cmd怎么查询mysql)
- MySQL三种日志格式全局日志二进制日志和错误日志(mysql三种日志格式)
- 深入理解MySQL详解一万字(mysql万字解析)
- MySQL出现不在列表错误怎么办(mysql不在列表)
- 探析MySQL的错误解释现象(mysql不正确解释)