如何通过Oracle存储过程发送图片附件并解决ORA-01460报错?
问题原因
ORA-01460报错的核心诱因是C#向Oracle存储过程传参时,字节数组类型参数未被正确识别为BLOB类型,Oracle驱动默认将其映射为长度上限仅4000字节的VARCHAR2类型,当图片字节数超过限制时就会触发转换错误,部分冗余代码也可能放大该问题。
解决方案
1. 修正C#参数定义,显式指定BLOB类型
不要直接传入字节数组让驱动自动推断类型,必须显式声明参数为OracleDbType.Blob,同时建议去掉参数名前的@前缀,部分Oracle驱动不识别该前缀会导致参数匹配失败:
// 替换原来的参数添加逻辑 cmd.Parameters.Add("V_ATTACH_NAME1", "QR_CODE.png"); cmd.Parameters.Add("V_ATTACH_MIME1", "image/png"); OracleParameter blobParam = new OracleParameter("V_ATTACH_BLOB1", OracleDbType.Blob); blobParam.Value = imageByteArray; cmd.Parameters.Add(blobParam);
2. 简化存储过程调用逻辑
你调用的是无结果集返回的存储过程,不需要用ExecuteReader和DataSet填充逻辑,改用ExecuteNonQuery即可,避免额外的转换开销:
// 删除以下冗余代码 // cmd.ExecuteReader(); // OracleDataAdapter da = new OracleDataAdapter(cmd); // DataSet ds = new DataSet(); // da.Fill(ds); // 替换为 cmd.ExecuteNonQuery();
3. 优化图片读取逻辑
不需要通过Image类中转转换,直接读取文件原生字节即可,避免自定义转换方法引入的额外问题:
// 替换原来的Image读取+转换逻辑 byte[] imageByteArray = File.ReadAllBytes(@"\\data\Public\abc\59.png");
4. 修正存储过程邮件头配置(非报错直接原因,需同步修改避免附件不显示)
你当前使用的multipart/alternative仅支持纯文本和HTML两种邮件内容切换,包含附件的邮件必须使用multipart/mixed类型:
-- 替换SEND_MAIL_RECIPIENT_ATTACH存储过程里的对应行 UTL_SMTP.write_data(l_mail_conn, 'Content-Type: multipart/mixed; boundary="' || l_boundary || '"' || UTL_TCP.crlf || UTL_TCP.crlf);
补充优化建议
建议用using语句包裹OracleConnection、OracleCommand对象,无需手动编写关闭和释放资源的代码,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Moin Khan
相关产品推荐
相关产品推荐

