C# ADO.NET调用Oracle存储过程无报错但数据未生效排查
问题排查:C#调用Oracle存储过程无报错但未写入数据
问题描述
通过C#向Oracle数据库提交卷材数据时,服务端无任何报错,接口返回成功,但数据库未出现数据变更。项目其他模块使用几乎相同的代码可正常保存数据,需排查原因。
C#代码实现
public ActionResult SaveBobinDetails(AllBobinData allBobinData) { using (OracleConnection connection = new OracleConnection(OracleHelper.DbConnect)) { connection.Open(); try { string storedProcedureName = "Z_TMP_PORTAL.save_qua_opr_data_detail"; using (OracleCommand commandpiece = new OracleCommand(storedProcedureName, connection)) { commandpiece.CommandType = CommandType.StoredProcedure; commandpiece.CommandText = storedProcedureName; // Stored Procedure adını buraya yazın if (allBobinData.selectedValue == "TANDEM") { commandpiece.Parameters.Add("p_piece_id", OracleDbType.Varchar2).Value = allBobinData.p_piece_id; commandpiece.Parameters.Add("p_op_data_id", OracleDbType.Int32).Value = Convert.ToInt32(allBobinData.p_op_data_id); commandpiece.Parameters.Add("p_olculen_kalinlik_opr", OracleDbType.BinaryFloat).Value = Convert.ToDouble(allBobinData.oprkenarpltcm); commandpiece.Parameters.Add("p_olculen_kalinlik_orta", OracleDbType.BinaryFloat).Value = Convert.ToDouble(allBobinData.ortakenarpltcm); commandpiece.Parameters.Add("p_olculen_kalinlik_motor", OracleDbType.Int32).Value = Convert.ToDouble(allBobinData.mtrkenarpltcm); commandpiece.Parameters.Add("p_olculen_genislik", OracleDbType.BinaryFloat).Value = Convert.ToDouble(allBobinData.genislikpltcm); commandpiece.Parameters.Add("p_opr_kenar_dalgasi_yukseklik", OracleDbType.Int32).Value = Convert.ToInt32(allBobinData.p_opr_kenar_dalgasi_yukseklik); commandpiece.Parameters.Add("p_opr_kenar_dalgasi_frekans", OracleDbType.Int32).Value = Convert.ToInt32(allBobinData.p_opr_kenar_dalgasi_frekans); commandpiece.Parameters.Add("p_motor_kenar_dalgasi_yukseklik", OracleDbType.Varchar2).Value = Convert.ToInt32(allBobinData.p_motor_kenar_dalgasi_yukseklik); commandpiece.Parameters.Add("p_motor_kenar_dalgasi_frekans", OracleDbType.Varchar2).Value = Convert.ToInt32(allBobinData.p_motor_kenar_dalgasi_frekans); commandpiece.Parameters.Add("p_gobek_dalgasi_yukseklik", OracleDbType.Varchar2).Value = Convert.ToInt32(allBobinData.p_gobek_dalgasi_yukseklik); commandpiece.Parameters.Add("p_gobek_dalgasi_frekans", OracleDbType.Varchar2).Value = Convert.ToInt32(allBobinData.p_gobek_dalgasi_frekans); } commandpiece.ExecuteNonQuery(); } } catch (Exception) { return Json(false, JsonRequestBehavior.AllowGet); } } return Json(true, JsonRequestBehavior.AllowGet); }
Oracle存储过程代码
CREATE OR REPLACE PROCEDURE save_qua_opr_data_detail ( p_op_data_id IN NUMBER DEFAULT NULL, p_piece_id IN VARCHAR2 DEFAULT NULL, -- Diğer parametreler... p_operatör IN VARCHAR2 DEFAULT NULL, p_formen IN VARCHAR2 DEFAULT NULL ) IS v_piece_count NUMBER; BEGIN CASE WHEN p_op_data_id IS NULL THEN INSERT INTO Z_TMP_PORTAL_QUA_OP_DATA ( -- Sütunları buraya ekleyin -- Örnek: COLUMN_NAME ) VALUES ( -- Değerleri buraya ekleyin -- Örnek: p_piece_id ); ELSE UPDATE Z_TMP_PORTAL_QUA_OP_DATA SET -- Güncellenecek sütunları ve değerlerini buraya ekleyin -- Örnek: COLUMN_NAME = p_value WHERE OP_DATA_ID = p_op_data_id; END CASE; END save_qua_opr_data_detail;
核心问题排查
- 存储过程无实际写入逻辑:从Oracle代码可见,
INSERT和UPDATE语句仅保留注释,未填写实际的列名和值,执行存储过程不会对数据库产生任何变更,这是最直接的原因。 - 条件分支可能未触发:C#代码仅当
allBobinData.selectedValue == "TANDEM"时才添加参数,若该值不匹配,所有参数会使用存储过程定义的默认值(如p_op_data_id默认NULL),但即使进入INSERT分支,也无实际写入操作。 - 参数类型不匹配:存在多处参数类型与赋值类型不一致的情况,例如:
p_olculen_kalinlik_motor定义为OracleDbType.Int32,但赋值是Convert.ToDoublep_motor_kenar_dalgasi_yukseklik定义为OracleDbType.Varchar2,但赋值是Convert.ToInt32
虽然Oracle可能做隐式转换,但可能导致逻辑异常,且当前代码吞掉了所有异常,无法及时发现问题。
- 异常处理不健全:
catch块仅返回false,未记录任何异常信息,即使存储过程执行出错,也无法定位具体原因。
内容的提问来源于stack exchange,提问作者Osman TÜRK
相关产品推荐
相关产品推荐

