【问题标题】:Oracle.ManagedDataAccess.Client.OracleException: "ORA-01843: not a valid month"Oracle.ManagedDataAccess.Client.OracleException:“ORA-01843:无效月份”
【发布时间】:2021-05-16 17:21:22
【问题描述】:

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

Oracle 程序:

    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()) {

【问题讨论】:

  • 将月/年整数值转换为日期然后再转换回整数是没有意义的。只需使用WHERE EXTRACT(MONTH FROM REG_DATE) = MONTHp AND EXTRACT(YEAR FROM REG_DATE) = YEARp
  • REG_DATE的数据类型是什么?
  • @Wernfried Domscheit,日期

标签: c# oracle api


【解决方案1】:

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

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

小心!谢谢大家的时间和回答!

【讨论】:

    猜你喜欢
    • 2014-08-03
    • 1970-01-01
    • 2015-07-04
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    相关资源
    最近更新 更多