Итак, у нас есть сервер AIX (ugh), который запускает систему ERP. Эта система, созданная в отчетах, сосать, поэтому мне, конечно, поручено создавать отчеты, которые нам нужны.
У меня есть много отчетов, которые я запускаю, и, конечно же, для конкретных дат и т.д. Кодирование выполняется на С#, запущенном в ASP.net, в окне Windows Server 2003 Standard Server. Он использует Informix CSDK для подключения через .Net Data Adapter, который поставляется вместе с CSDK. Сервер запускает Informix 10 на сервере AIX 5.2.
Что странно в том, что в любое время, когда мы запускаем и останавливаем Informix или перезагружаем сервер и т.д., похоже, что Informix решает изменить способ обработки даты через CSDK. Если он в настоящее время ожидает MM/DD/YYYY, тогда он в конечном итоге решит после вышеупомянутой ситуации, которая хочет его в ГГГГ/ММ/ДД. Обычно это приводит к ошибке "Недействительный месяц в дате". Затем я перехожу к своей функции dateformat (чтобы я мог легко откинуться назад и вперед) и вручную изменить ее. Пару отчетов, которые я создал для обработки этой ошибки, а затем повторить один и тот же запрос с другим форматом даты. Это, конечно, меньше идеала, и я хотел бы разобраться с ним!
Вот какой-то вложенный текст из ошибки страницы ASP.net. Спасибо!
Server Error in '/' Application. ERROR [HY000] [Informix .NET provider][Informix]Invalid month in date Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about theerror and where it originated in the code. Exception Details: IBM.Data.Informix.IfxException: ERROR [HY000] [Informix .NET provider][Informix]Invalid month in date Source Error: Line 479: Line 480: //aUsage = new IfxDataAdapter(sSelect_Usage, conn); Line 481: aUsage.Fill(dsUsage, "Usage"); Line 482: aUsage.Dispose(); Line 483: dtUsage = dsUsage.Tables["Usage"]; Source File: D:\Inetpub\reports2.oscarwinski.com\App_Code\IMRShipClass.cs Line: 481 Stack Trace: [IfxException: ERROR [HY000] [Informix .NET provider][Informix]Invalid month in date] IBM.Data.Informix.IfxConnection.HandleError(IntPtr hHandle, SQL_HANDLE hType, RETCODE retcode) +26 IBM.Data.Informix.IfxCommand.ExecuteReaderObject(CommandBehavior behavior, String method) +654 IBM.Data.Informix.IfxCommand.ExecuteReader(CommandBehavior behavior) +117 IBM.Data.Informix.IfxCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) +4 System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +130 System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +287 System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable) +92 IMRShipClass.Generate() in D:\Inetpub\reports2.oscarwinski.com\App_Code\IMRShipClass.cs:481 IMRShip.testIMR() in D:\Inetpub\reports2.oscarwinski.com\IMRShip.aspx.cs:114 IMRShip.btnExport2Excel_Click1(Object sender, EventArgs e) in D:\Inetpub\reports2.oscarwinski.com\IMRShip.aspx.cs:259 System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111 System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +110 System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565 Version Information: Microsoft .NET Framework Version:2.0.50727.3082; ASP.NET Version:2.0.50727.3082
Формат даты контролируется клиентом, а не сервером. Очевидно, что он имеет дефолт (формат США), но каждый клиент может диктовать формат, который он хочет использовать. Это делается путем установки переменной DBDATE
. (Существует также GL_DATE
, если вы используете локали.)
Если формат даты был включен, вы должны проверить значение этой переменной среды. Установлено ли это промежуточным программным обеспечением в некоторых случаях?
Это может быть не так для вашей конкретной установки, но я видел, как серверы меняют формат даты, сообщаемый базам данных, когда у администраторов была установлена их локаль, отличная от значения по умолчанию, но только во время входа в систему! Вы можете проверить настройки страны/региона для каждого пользователя в системе.
DB2/Informix переопределяет формат даты клиента. Вы связываетесь с администратором Db2 и устанавливаете формат даты на стороне сервера один раз для всех. Мы столкнулись с такой же проблемой в AS400 (DB2), и администратор базы данных никогда не принимал ее, как в вашем случае. После того, как синтаксис формата даты ISO был взят с сайта IBM и предоставлен администратору DB2, он изменил его. После этого наши программы отлично работали с датами.
Удачи.
Это, вероятно, не связано, но я получал ту же ошибку. Я закончил тем, что менял одиночные кавычки в моем SQL в круглые скобки. Я использовал параметризованный SQL.
SELECT id, descriptor FROM Foo WHERE descriptor >= '?'
становится
SELECT id, descriptor FROM Foo WHERE descriptor >= (?)
Установите DBDATE=MDY4/
в клиентское приложение, которое также запускает отчеты и все остальные клиенты.
Urgh!.NET не мой сильный момент - вам, возможно, придется адаптировать то, что я говорю, чтобы работать правильно.
В Windows, к лучшему или худшему, есть утилита Informix под названием SETNET32, которая может использоваться для установки связанных с Informix переменных среды для программ Windows, которые подключаются к базам данных Informix. Вы не упоминаете, используете ли вы что-либо, используя это. Изучите, используется ли он поставщиком Informix.NET.
Вы также не упоминаете, перезапускается ли экземпляр сервера IDS в окне AIX при возникновении проблемы. Я предполагаю, что нет. (Анализ мог бы отличаться, если бы это было сделано.)
Основной переменной среды, которая управляет форматом даты, является DBDATE. Он принимает различные обозначения, например:
DBDATE=dmy4/ # 30/07/2009
DBDATE=mdy4/ # 07/30/2009
DBDATE=y4md- # 2009-07-30
DBDATE=mdy20 # 073009
Не используйте последнюю. Если есть изменения в значении DBDAT
E, это может отражать некоторые ваши проблемы, и установка DBDATE
, вероятно, устранит ваши проблемы.
Существуют и другие переменные, влияющие на интерпретацию даты, если DBDATE
не задано; они включают CLIENT_LOCALE
и DB_LOCALE
, и даже GL_DATE
. Тем не менее, DBDATE
имеет наивысший приоритет и чаще всего устанавливается большинством людей.
Запустите экземпляр informix как root вместо пользователя informix... он решает мой pb и мой ночной lol