В настоящее время у меня в приложении есть модель, использующая ODP.NET от Oracle.Теперь я могу использовать linq-запросы.
Программа выполняет следующее:
DateTime searchDate = DateTime.Now.AddDays(-days);
oracleShipments = oracleEntities.Shipments.Where(s => consignorCodes.Contains(s.CONSIGNOR) && s.UNLOADINGTIMEEND > searchDate).ToList();
s.UNLOADINGTIMEEND
= DateTime?searchDate
= DateTime
Код работает на моем компьютере, он возвращает мне список с правильными отправлениями.Все работает, за исключением другого компьютера, там он выдаст мне следующее внутреннее исключение:
Oracle.ManagedDataAccess.Client.OracleException (0x80004005): ORA-01843: Geen geldige maand.Bij OracleInternal.ServiceObjects.OracleConnectionImpl.VerifyExecution (Int32 & CursorID, булевы bThrowArrayBindRelatedErrors, SqlStatementType sqlStatementType, Int32 arrayBindCount, OracleException & exceptionForArrayBindDML, булевы & hasMoreRowsInDB, булева bFirstIterationDone) Bij OracleInternal.ServiceObjects.OracleCommandImpl.ExecuteReader (String CommandText, OracleParameterCollection paramColl, CommandType CommandType, OracleConnectionImpl connectionImpl, OracleDataReaderImpl & rdrImpl, Int32 longFetchSize, Int64 clientInitialLOBFS, OracleDependencyImpl orclDependencyImpl, Int64 [] scnForExecution, Int64 [] & scnFromExecution, OracleParameterCollection & bindByPositionParamColl, булева & bBindParamPresent, Int64 & internalInitialLOBFS, OracleException & exceptionForArrayBindDML, OracleConnection соединение, oracleLogicalTransaction & oracleLogicalTransaction, IEnumerable`1 adrianParsedStmt, булева isDescribeOnly,Boolean isFromEF) bij Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteReader (булево требование, булево заполнениеRequest, поведение CommandBehavior)target, операция Func`3, TInterceptionContext interceptionContext, действие Action3 выполняется, действие Action 3 выполняется) bij System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader (команда DbCommand, DbCommandInterceptionContext interceptionContext) bij System.Data.Ent.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands (EntityCommand entityCommand, поведение CommandBehavior)
Обратите внимание: Geen geldig maand.
означает Not a valid month.
Оглядываясь назад на запрос Linq: s.UNLOADINGTIMEEND > searchDate
* оба формат DateTime.Сравнивать их было бы легко.Я думаю, что это связано с NLS-dateformat.
NLS_DATE_FORMAT
сервера DD-MON-RR
.
Есть ли возможность заставить это работать на всех компьютерах?Я предпочитаю использовать Linq над жестко заданным типизированным запросом.
Вывод linq-запроса:
SELECT "Extent1"."SHIPMENT" AS "SHIPMENT", "Extent1"."CONSIGNOR" AS
"CONSIGNOR", "Extent1"."UNLOADINGCOMPANY" AS "UNLOADINGCOMPANY",
"Extent1"."UNLOADINGCITY" AS "UNLOADINGCITY",
"Extent1"."UNLOADINGCOUNTRY" AS "UNLOADINGCOUNTRY",
"Extent1"."UNLOADINGPLANNEDSTART" AS "UNLOADINGPLANNEDSTART",
"Extent1"."UNLOADINGPLANNEDEND" AS "UNLOADINGPLANNEDEND",
"Extent1"."UNLOADINGREALIZEDSTART" AS "UNLOADINGREALIZEDSTART",
"Extent1"."UNLOADINGREALIZEDEND" AS "UNLOADINGREALIZEDEND",
"Extent1"."UNLOADINGACTUALSTART" AS "UNLOADINGACTUALSTART",
"Extent1"."UNLOADINGACTUALEND" AS "UNLOADINGACTUALEND",
"Extent1"."UNLOADINGTIMESTART" AS "UNLOADINGTIMESTART",
"Extent1"."UNLOADINGTIMEEND" AS "UNLOADINGTIMEEND", "Extent1"."Fixed"
AS "Fixed" FROM (SELECT "V_PERFORMANCETOOL"."SHIPMENT" AS
"SHIPMENT", "V_PERFORMANCETOOL"."CONSIGNOR" AS "CONSIGNOR",
"V_PERFORMANCETOOL"."UNLOADINGCOMPANY" AS "UNLOADINGCOMPANY",
"V_PERFORMANCETOOL"."UNLOADINGCITY" AS "UNLOADINGCITY",
"V_PERFORMANCETOOL"."UNLOADINGCOUNTRY" AS "UNLOADINGCOUNTRY",
"V_PERFORMANCETOOL"."UNLOADINGPLANNEDSTART" AS
"UNLOADINGPLANNEDSTART",
"V_PERFORMANCETOOL"."UNLOADINGPLANNEDEND" AS
"UNLOADINGPLANNEDEND",
"V_PERFORMANCETOOL"."UNLOADINGREALIZEDSTART" AS
"UNLOADINGREALIZEDSTART",
"V_PERFORMANCETOOL"."UNLOADINGREALIZEDEND" AS
"UNLOADINGREALIZEDEND",
"V_PERFORMANCETOOL"."UNLOADINGACTUALSTART" AS
"UNLOADINGACTUALSTART", "V_PERFORMANCETOOL"."UNLOADINGACTUALEND"
AS "UNLOADINGACTUALEND", "V_PERFORMANCETOOL"."UNLOADINGTIMESTART"
AS "UNLOADINGTIMESTART", "V_PERFORMANCETOOL"."UNLOADINGTIMEEND"
AS "UNLOADINGTIMEEND", "V_PERFORMANCETOOL"."Fixed" AS "Fixed"
FROM "CUSTOMIZATION"."V_PERFORMANCETOOL" "V_PERFORMANCETOOL")
"Extent1" WHERE ((('Company1' = "Extent1"."CONSIGNOR") OR
('Company2' = "Extent1"."CONSIGNOR")) AND
("Extent1"."UNLOADINGTIMEEND" > :p__linq__0))
-- p__linq__0: '13-12-2018 10:27:16' (Type = Date, IsNullable = false)
-- Executing at 20-12-2018 10:27:17 +01:00
-- Completed in 471 ms with result: OracleDataReader
В представлении Oracle UNLOADINGTIMEEND
имеет DATA_TYPE
= DATE
, который может быть обнуляемым.Я дважды проверил, и столбец таблицы (где я получаю информацию) также имеет тип DATE
.
При замене p__linq__0
на TO_DATE('2018/12/13 11:00:00', 'YYYY/MM/DD HH:MI:SS')
и выполнении запроса, сгенерированного Linq, я получилте же результаты, что и в моей программе.
Дополнительная информация:
- .NET Framework 4.6.1 (из-за совместимости в нашей компании, которую я использую)
- Oracle.ManagedDataAccess 18.3.0
- Oracle.ManagedDataAccess.EntityFramework 18.3.0