ORA-01460错误求助:向OracleDB传输byte[]图片数据失败
解决ORA-01460错误:将byte[]存入Oracle BLOB列的正确做法
你遇到的ORA-01460错误核心问题出在代码的执行逻辑和参数处理上,具体原因及修正方案如下:
问题根源
- 用
OracleDataAdapter.Fill()执行存储过程完全错误,这个方法是用来查询并填充数据集的,执行插入操作应该用ExecuteNonQuery() - 没必要把BLOB参数设为
InputOutput方向,你只是要写入数据,设为Input即可 - 直接给BLOB参数赋值大字节数组时,容易触发Oracle的转换限制,需规范参数处理方式
修正后的代码
public void AddUser(string userFName, string userLName, byte[] userImage) { GetConnection(); try { using (oraConn) { OracleCommand cmd = new OracleCommand(); cmd.Connection = oraConn; cmd.CommandText = "SP_ADD_USERINFOS"; cmd.CommandType = CommandType.StoredProcedure; // 添加基础字符串参数 cmd.Parameters.Add("PFIRSTNAME", OracleType.VarChar).Value = userFName; cmd.Parameters.Add("PLASTNAME", OracleType.VarChar).Value = userLName; // 规范处理BLOB参数 OracleParameter imageParam = new OracleParameter("PIMAGE", OracleType.Blob); imageParam.Direction = ParameterDirection.Input; imageParam.Value = userImage; cmd.Parameters.Add(imageParam); // 执行插入操作,而非填充数据集 oraConn.Open(); cmd.ExecuteNonQuery(); } } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { // 确保连接最终关闭,放在finally块更安全 if (oraConn != null && oraConn.State == ConnectionState.Open) { oraConn.Close(); } } }
额外优化建议(针对大尺寸图片)
如果图片字节数组超过几MB,建议改用流写入的方式避免内存溢出:
// 替换原BLOB参数处理及执行逻辑部分 OracleParameter imageParam = new OracleParameter("PIMAGE", OracleType.Blob); imageParam.Direction = ParameterDirection.Input; cmd.Parameters.Add(imageParam); oraConn.Open(); using (OracleTransaction tran = oraConn.BeginTransaction()) { cmd.Transaction = tran; cmd.ExecuteNonQuery(); // 通过OracleBlob流写入数据 OracleBlob blob = (OracleBlob)cmd.Parameters["PIMAGE"].Value; blob.Write(userImage, 0, userImage.Length); blob.Close(); tran.Commit(); }
必查验证点
确认你的存储过程SP_ADD_USERINFOS中,PIMAGE参数是否定义为BLOB类型,且明确标记为输入参数。
内容的提问来源于stack exchange,提问作者devMania
相关产品推荐
相关产品推荐

