快乐的昕的电脑
2025-10-13 e817898581caac37df9914b560b889f8b06bdee7
优化
已修改1个文件
69 ■■■■■ 文件已修改
Services/MesCutterLedgerManager.cs 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Services/MesCutterLedgerManager.cs
@@ -86,77 +86,54 @@
    }
    /// <summary>
    ///     获取工单表单数据(通过工单编号和机台编号查询)。
    ///     直接使用 Oracle.ManagedDataAccess.Client 调用存储过程并读取 REF CURSOR,避免参数绑定不匹配。
    /// 获取工单表单数据(通过工单编号和机台编号查询)。
    /// 使用 Oracle.ManagedDataAccess.Client 调用存储过程并读取 REF CURSOR,返回动态对象列表。
    /// </summary>
    /// <param name="workOrderNo">工单编号</param>
    /// <param name="machineNo">机台编号</param>
    /// <returns>表单数据的动态列表</returns>
    public List<dynamic> GetFormData(string workOrderNo, string machineNo)
    {
        // 从 SqlSugar 获取底层连接(确保对应的是 OracleConnection)
        using var conn = Db.Ado.Connection;
        if (conn == null) throw new Exception("无法获取数据库连接。");
        var result = new List<dynamic>();
        // 尝试将连接转换为 OracleConnection
        if (conn is not OracleConnection oracleConn)
        {
            // 如果不是 OracleConnection,尝试通过 ConnectionString 构建新的 OracleConnection
            oracleConn = new OracleConnection(Db.Ado.Connection.ConnectionString);
        }
        var connStr = Db.Ado.Connection?.ConnectionString;
        if (string.IsNullOrEmpty(connStr)) throw new Exception("无法获取数据库连接字符串。");
        var resultList = new List<dynamic>();
        try
        {
            using var oracleConn = new OracleConnection(connStr);
            using var cmd = oracleConn.CreateCommand();
            cmd.CommandText = "PROC_GET_FORM_DATA";
            cmd.CommandType = CommandType.StoredProcedure;
            // 注意:参数名称与存储过程签名必须完全一致(顺序也很重要)
            var pWorkOrder = new OracleParameter("V_WORK_ORDER_NO", OracleDbType.Varchar2, ParameterDirection.Input)
            {
                Value = string.IsNullOrEmpty(workOrderNo) ? (object)DBNull.Value : workOrderNo
            };
            var pMachine = new OracleParameter("V_MACHINE_NO", OracleDbType.Varchar2, ParameterDirection.Input)
            {
                Value = string.IsNullOrEmpty(machineNo) ? (object)DBNull.Value : machineNo
            };
            var pCursor = new OracleParameter("PO_CURSOR", OracleDbType.RefCursor, ParameterDirection.Output);
            cmd.Parameters.Add("V_WORK_ORDER_NO", OracleDbType.Varchar2).Value =
                string.IsNullOrEmpty(workOrderNo) ? (object)DBNull.Value : workOrderNo;
            cmd.Parameters.Add("V_MACHINE_NO", OracleDbType.Varchar2).Value =
                string.IsNullOrEmpty(machineNo) ? (object)DBNull.Value : machineNo;
            var pCursor = cmd.Parameters.Add("PO_CURSOR", OracleDbType.RefCursor);
            pCursor.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(pWorkOrder);
            cmd.Parameters.Add(pMachine);
            cmd.Parameters.Add(pCursor);
            var mustOpen = oracleConn.State != ConnectionState.Open;
            if (mustOpen) oracleConn.Open();
            oracleConn.Open();
            using var reader = cmd.ExecuteReader();
            var dt = new DataTable();
            dt.Load(reader);
            foreach (DataRow row in dt.Rows)
            while (reader.Read())
            {
                IDictionary<string, object> expando = new ExpandoObject();
                foreach (DataColumn col in dt.Columns)
                IDictionary<string, object> row = new ExpandoObject();
                for (int i = 0; i < reader.FieldCount; i++)
                {
                    expando[col.ColumnName] = row[col] == DBNull.Value ? null : row[col];
                    var name = reader.GetName(i);
                    var val = reader.IsDBNull(i) ? null : reader.GetValue(i);
                    row[name] = val;
                }
                resultList.Add(expando);
                result.Add(row);
            }
            return resultList;
            return result;
        }
        catch (OracleException oex)
        {
            throw new Exception($"调用存储过程 PROC_GET_FORM_DATA 失败(OracleException): {oex.Message}");
            throw new Exception($"调用存储过程 PROC_GET_FORM_DATA 失败(OracleException):{oex.Message}");
        }
        catch (Exception ex)
        {
            throw new Exception($"调用存储过程 PROC_GET_FORM_DATA 失败: {ex.Message}");
        }
        finally
        {
            try { if (oracleConn.State == ConnectionState.Open) oracleConn.Close(); } catch { }
            throw new Exception($"调用存储过程 PROC_GET_FORM_DATA 失败:{ex.Message}");
        }
    }
}