Недопустимый месяц в дате - формат даты в Informix периодически возвращается - PullRequest
2 голосов
/ 30 июля 2009

Итак, у нас есть сервер AIX (тьфу), на котором работает система ERP. Встроенные в эту систему отчеты отстой, поэтому мне, конечно, поручено создавать нужные нам отчеты.

У меня много отчетов, которые я запускаю, и, конечно, большинство из них относятся к конкретным датам и т. Д. Кодирование выполняется на C # в ASP.net на стандартном сервере Windows 2003. Он использует Informix CSDK для подключения через .Net Data Adapter, который поставляется вместе с CSDK. Сервер выполняет Informix 10 на сервере AIX 5.2.

Что странно, так это то, что каждый раз, когда мы запускаем и останавливаем Informix или перезагружаем сервер и т. Д., Кажется, что Informix решает изменить способ обработки даты через CSDK. Если он в настоящее время ожидает MM / DD / YYYY, то в конечном итоге он решит после того, как вышеупомянутая ситуация, что хочет его в YYYY / MM / DD. Обычно это приводит к ошибке «Недопустимый месяц в дате». Затем я вхожу в свою функцию форматирования даты (сделанную так, чтобы я мог легко переключаться назад), и вручную меняю ее. Пара отчетов, которые я встроил в обработку этой ошибки, а затем повторите тот же запрос с другим форматом даты. Это, конечно, не идеально, и я бы хотел докопаться до сути!

Вот некоторый вставленный текст из ошибки страницы 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 

Ответы [ 7 ]

1 голос
/ 31 июля 2009

Формат даты контролируется клиентом, а не сервером. Очевидно, он имеет значение по умолчанию (формат США), но каждый клиент может диктовать формат, который он хочет использовать. Это делается путем установки переменной окружения DBDATE . (Существует также GL_DATE, если вы используете локали.)

Если формат даты изменился, вам следует проверить значение этой переменной среды. Это устанавливается вашим промежуточным программным обеспечением в некоторых обстоятельствах?

0 голосов
/ 24 марта 2016

Запустите экземпляр informix от имени пользователя root вместо пользователя informix .... он решает мои задачи и мою ночь lol

0 голосов
/ 12 декабря 2010

Это может не относиться к вашей конкретной установке, но я видел, как серверы изменяли формат даты, сообщаемый базам данных, когда администраторы установили в качестве локали нечто отличное от значения по умолчанию, но только во время входа в систему! Вы можете проверить настройки страны / региона для КАЖДОГО пользователя в системе.

0 голосов
/ 23 ноября 2010

DB2 / Informix переопределяет формат даты клиента. Вы связываетесь со своим администратором Db2 и устанавливаете формат даты на стороне сервера раз и навсегда. Мы столкнулись с той же проблемой в AS400 (DB2), и администратор БД никогда не принимал ее, как в вашем случае. Как только синтаксис формата даты ISO был взят с сайта IBM и передан администратору DB2, он изменил его. После этого наши программы работали с датами.
Удачи.

0 голосов
/ 17 ноября 2010

Возможно, это не связано, но я получаю ту же ошибку. В итоге я заменил одинарные кавычки в своем SQL на круглые скобки. Я использовал параметризованный SQL.

SELECT id, descriptor FROM Foo WHERE descriptor >= '?' становится

SELECT id, descriptor FROM Foo WHERE descriptor >= (?) 
0 голосов
/ 11 октября 2009

Установите DBDATE=MDY4/ в клиентском приложении, которое запускает отчеты, и на всех остальных клиентах.

0 голосов
/ 31 июля 2009

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 имеет самый высокий приоритет и является наиболее часто устанавливаемым людьми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...