C#.NET开发Winform使用MySQL数据库 无法将“System.Byte[]”的对象强制转换为类型“System.IConvertible”

C#.NET 3.5开发winform程序,后台使用的是MySQL 5.1.x 数据库

从MySQL官网下的 mysql-connector-net-6.5.4,安装后在.NET里使用正常,使用MySqlConnection,MySqlCommand操作的数据库,自己写了一个MySqlHelper.cs,里面有一个执行MySqlCommand的方法用于更新数据

private const string connectString = "server=127.0.0.1;uid=root;pwd=root;database=dbname";
public static bool MysqlExcute(MySqlCommand cmd)
{
    MySqlConnection conn = new MySqlConnection(connectString);
    conn.Open();
    cmd.Connection = conn;
    int rtn = cmd.ExecuteNonQuery();
    conn.Close();
    return rtn > 0;
}

数据库的pic表中有一个longblob字段pic_data,存储图片数据
现在在程序中获得了图片的路径path,下面的程序执行后,会在MySqlExcute方法中的ExecuteNonQuery那句话上报错
无法将“System.Byte[]”的对象强制转换为类型“System.IConvertible”

// 读取图片内容
                FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
                Byte[] imgByte = new Byte[fs.Length];                
                fs.Read(imgByte, 0, imgByte.Length);

                // 插入图片
                MySqlCommand cmd = new MySqlCommand("INSERT INTO pic(pic_data, upload_username, upload_datetime) " +
                    "VALUES(?pic_name, ?pic_data, ?upload_username, ?upload_datetime)");
                cmd.Parameters.AddWithValue("?pic_name", pic_name);
                cmd.Parameters.AddWithValue("?pic_data", MySqlDbType.VarBinary).Value = imgByte;
                cmd.Parameters.AddWithValue("?upload_username", Session.username);
                cmd.Parameters.AddWithValue("?upload_datetime", DateTime.Now.ToString());
                if (MySqlHelper.MysqlExcute(cmd))
                {
                    // 上传成功
                    // ...
                }
                else
                {
                    // ...
                }

问题已经解决。
错误出现在

cmd.Parameters.Add("?pic_data", MySqlDbType.VarBinary).Value = imgByte;
这句话并没有调用

public MySqlParameter Add(string parameterName, MySqlDbType dbType);
而是调用了

public MySqlParameter Add(string parameterName, object value);
于是,MySqlDbType.VarBinary 被当成 "?pic_data" 的值传给cmd.Parameters,
.Value = imgByte再将 "?pic_data" 的值这个值覆盖为imgBtye
直接执行cmd.ExecuteNonQuery()由于没有指定 ?pic_data 的类型而报错
正确的做法是

MySqlParameter param = new MySqlParameter();
param.MySqlDbType = MySqlDbType.VarBinary;
param.ParameterName = "?pic_data";
param.Value = imgByte;
cmd.Parameters.Add(param);


你可能感兴趣的:(C#)