首页 > 解决方案 > Oracle.ManagedDataAccess.Client.OracleException:“ORA-01843:无效月份”

问题描述

我在调试时通过 C# 连接到 Oracle,出现以下错误:Oracle.ManagedDataAccess.Client.OracleException: "ORA-01843: not a valid month"。我以为是路线。更改通过 url 获取变量的方式没有帮助。

甲骨文程序:

    PROCEDURE TestSelect(YEARp IN INT, MONTHp IN INT, pResult OUT SYS_REFCURSOR) IS
        BEGIN
            OPEN pResult FOR
            SELECT SUM(LOAD_MATERIALS), REG_DATE
            FROM PRODUCTION 
            WHERE EXTRACT(MONTH FROM REG_DATE) = EXTRACT(MONTH FROM TO_DATE(MONTHp, 'MM')) AND EXTRACT(YEAR FROM REG_DATE) = EXTRACT(YEAR FROM TO_DATE(YEARp, 'YYYY'))
            GROUP BY REG_DATE;
        END TestSelect;

C#:

        [HttpGet("test")]
        public List<Charts> GetCertainEmployees(int month, int year)
        {
            List<Charts> SelectPerem = new List<Charts>();
            string conString = "User Id=*; Password=*; Data Source=*";
            using (OracleConnection con = new OracleConnection(conString))
            {
                using (OracleCommand cmd = con.CreateCommand())
                {
                    try
                    {
                        con.Open();
                        cmd.BindByName = true;

                        cmd.CommandText = "PACKAGE_PRACTICE.TestSelect";
                        cmd.CommandType = CommandType.StoredProcedure;

                        cmd.Parameters.Add("YEARp", OracleDbType.Int32, month, ParameterDirection.Input);
                        cmd.Parameters.Add("MONTHp", OracleDbType.Int32, year, ParameterDirection.Input);

                        var pResult = new OracleParameter("pResult", OracleDbType.RefCursor, ParameterDirection.Output);
                        cmd.Parameters.Add(pResult);

                        cmd.ExecuteNonQuery();
                        var res = (OracleRefCursor)pResult.Value;
                        var reader = res.GetDataReader();

                        while (reader.Read())
                        {
                            Charts s = new Charts();
                            s.LOAD_MATERIALS = Convert.ToInt32(reader[0]);
                            s.REG_DATE = Convert.ToString(reader[1]);
                            SelectPerem.Add(s);
                        }
                    }
                    finally
                    {
                        con.Close();
                        con.Dispose();
                    }
                }
            }
            return SelectPerem;
        }

错误发生在这一行:

while (reader.Read()) {

标签: c#oracleapi

解决方案


我解决了这个问题。变量混合在这些行中:

cmd.Parameters.Add("YEARp", OracleDbType.Int32, month, ParameterDirection.Input);
cmd.Parameters.Add("MONTHp", OracleDbType.Int32, year, ParameterDirection.Input);

当心!谢谢大家的时间和答案!


推荐阅读