WinForms读取MySQL存储的签名图片报Parameter is not valid错误求助
问题解决方案
核心错误原因
你遇到的Parameter is not valid报错本质是签名数据在存入数据库阶段就已经损坏,读取时拿到的字节数组根本不是合法的图像二进制流,所以无法转为Image对象。
你当前的保存逻辑存在两个致命问题:
- 直接将
signature对象拼接入SQL语句,如果signature是Image/Bitmap类型,拼接时只会隐式转为System.Drawing.Bitmap这类类名字符串,存入BLOB字段的是这段字符串的字节,完全不是图像本身的二进制数据 - 拼接SQL的方式即使提前转了字节,也会因为字符编码转义篡改二进制内容,同时存在严重SQL注入风险
第一步:修复签名保存逻辑
先将签名图像转为标准二进制数组,再用参数化查询写入数据库:
// 将Image类型的签名转为PNG格式字节数组,PNG支持透明,更适配签名场景 byte[] signatureBytes; using (MemoryStream ms = new MemoryStream()) { signature.Save(ms, System.Drawing.Imaging.ImageFormat.Png); signatureBytes = ms.ToArray(); } // 参数化插入,保证二进制数据不被篡改,同时避免SQL注入 string insertSql = "INSERT INTO signatures (name, signature) VALUES (@name, @signature)"; using (MySqlCommand cmd = new MySqlCommand(insertSql, DBconnection)) { cmd.Parameters.AddWithValue("@name", TXTname.Text); cmd.Parameters.AddWithValue("@signature", signatureBytes); cmd.ExecuteNonQuery(); }
第二步:优化签名读取逻辑
你原有的读取逻辑也需要调整参数化查询,同时避免字段大小写敏感、空值判断的问题:
DBconnection.Open(); // 只查需要的字段,性能更高 string query = "SELECT signature FROM signatures WHERE name = @name"; using (MySqlCommand queryCmd = new MySqlCommand(query, DBconnection)) { queryCmd.Parameters.AddWithValue("@name", CMBnames.Text); using (var reader = queryCmd.ExecuteReader()) { // 单条匹配用if即可,不需要while循环 if (reader.Read()) { // 先判断字段是否为空 if (!reader.IsDBNull(reader.GetOrdinal("signature"))) { byte[] img = (byte[])reader["signature"]; using (MemoryStream ms = new MemoryStream(img)) { pictureBox2.Image = System.Drawing.Image.FromStream(ms); } } else { CMBnames.Text = "error"; } } } } DBconnection.Close();
注意:MySQL在Linux环境下字段名大小写敏感,如果你建表时
signature字段是小写,读取时不要写全大写的SIGNATURE,否则会读空值触发报错。
内容的提问来源于stack exchange,提问作者LucOliSil
相关产品推荐
相关产品推荐

