You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.ToDouble
    • p_motor_kenar_dalgasi_yukseklik定义为OracleDbType.Varchar2,但赋值是Convert.ToInt32
      虽然Oracle可能做隐式转换,但可能导致逻辑异常,且当前代码吞掉了所有异常,无法及时发现问题。
  • 异常处理不健全:catch块仅返回false,未记录任何异常信息,即使存储过程执行出错,也无法定位具体原因。

内容的提问来源于stack exchange,提问作者Osman TÜRK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 16:27:05