Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ODP.NET:Oracle.ManagedDataAccess.Client.OracleException(0x80004005):ORA-01841 on.NET 5(核心)应用程序_C#_Oracle_.net 5_Odp.net_Oracle.manageddataaccess - Fatal编程技术网

C# ODP.NET:Oracle.ManagedDataAccess.Client.OracleException(0x80004005):ORA-01841 on.NET 5(核心)应用程序

C# ODP.NET:Oracle.ManagedDataAccess.Client.OracleException(0x80004005):ORA-01841 on.NET 5(核心)应用程序,c#,oracle,.net-5,odp.net,oracle.manageddataaccess,C#,Oracle,.net 5,Odp.net,Oracle.manageddataaccess,正在使用C#NET 5 web应用程序尝试使用Oracle.ManagedDataAcces.Client(ODP.NET)执行select 自2021年6月2日起,Oracle.ManagedDataAcces.Client版本为最新的3.21.1 错误: Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware 执行请求时发生未经处理的异常。 Oracle.ManagedDataAccess.Client.Oracle

正在使用C#NET 5 web应用程序尝试使用Oracle.ManagedDataAcces.Client(ODP.NET)执行select

自2021年6月2日起,Oracle.ManagedDataAcces.Client版本为最新的3.21.1

错误:

Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware 执行请求时发生未经处理的异常。 Oracle.ManagedDataAccess.Client.OracleException(0x80004005):ORA-01841:(完整)年份必须介于-4713和+9999之间,而不是0 在OracleInternal.ServiceObjects.OracleConnectionImpl.VerifyExecution(Int32&cursorId、Boolean bThrowArrayBindRelatedErrors、SqlStatementType、SqlStatementType、Int32 arrayBindCount、OracleException&Exception for ArrayBindML、Boolean&hasMoreRowsInDB、Boolean BfirstitionDone)

这是查询代码

   public async Task<int> GetMyCount(string userName, int THE_YEAR)
    {
        try
        {
            string TEST = "STACK_OVERFLOW_TEST";
            builder.Clear();

            builder.Append($@" SELECT COUNT(*) 
                FROM {configuration.SCHEMA}.SOME_TABLE CA 
                INNER JOIN {configuration.SCHEMA}.SOME_OTHER_TABLE CS 
                ON CS.ID=CA.ID ");

            if (viewNotAll)
            {
                builder.Append($" INNER JOIN {unitOfWork.oracleDbOptions.DBSchemaQP}.ANOTHER_TABLE UT ON CA.SOME_FIELD = UT.SOME_FIELD ");
            }

            builder.Append(@$" WHERE CA.DATE_TO_FILET BETWEEN TO_DATE(CONCAT('0101', :THE_YEAR),'DDMMYYYY') 
            AND TO_DATE(CONCAT('3112', :THE_YEAR),'DDMMYYYY') ");


            if (TEST == "NO")
                builder.Append(" AND CS.TEST_FIELD=0 ");
            else
                builder.Append(" AND CS.TEST_FIELD=:THE_TEST_FIELD ");


            int result = 0;

            using (var cmd = unitOfWork.connection.CreateCommand())
            {

                cmd.Parameters.Add("THE_YEAR", OracleDbType.Int16, 4, THE_YEAR, ParameterDirection.Input);
                cmd.Parameters.Add("THE_TEST_FIELD", OracleDbType.Varchar2, 20, userName, ParameterDirection.Input);

                cmd.CommandText = builder.ToString();
                using (var reader = await cmd.ExecuteReaderAsync())
                {
                    while (await reader.ReadAsync())
                    {
                        result = reader.IsDBNull(0) ? 0 : reader.GetInt32(0);
                    }
                }

                return result;
            }
        }
        catch (Exception)
        {
            throw;
        }
    }
但我希望使用参数来避免SQL注入

我做错了什么?

更好地使用

builder.Append(@$" WHERE CA.DATE_TO_FILET BETWEEN :aDate AND :bDate");

cmd.Parameters.Add("aDate", OracleDbType.Date, ParameterDirection.Input).Value = new DateTime(THE_YEAR, 1, 1);
cmd.Parameters.Add("bDate", OracleDbType.Date, ParameterDirection.Input).Value = new DateTime(THE_YEAR, 12, 31);

            

CONCAT连接两个字符串,因此_YEAR应该是四个字符的字符串,而不是整数。你试过了吗

cmd.Parameters.Add("THE_YEAR", OracleDbType.Varchar2, 4, THE_YEAR.ToString(), ParameterDirection.Input);

如果你阅读问题不是一个真正的解决方案而是一个完整的替换,你为什么不认为这是“真正的解决方案”?在字符串上使用
TO_DATE()
在我看来很愚蠢。直接使用
DATE
值。
cmd.Parameters.Add("THE_YEAR", OracleDbType.Varchar2, 4, THE_YEAR.ToString(), ParameterDirection.Input);