【问题标题】:Invalid Month in Date - Date format in Informix reverts sporadically日期中的月份无效 - Informix 中的日期格式偶尔恢复
【发布时间】:2010-11-15 13:18:51
【问题描述】:

所以我们有一个运行 ERP 系统的 AIX(呃)服务器。这个系统的内置报告很糟糕,所以我当然要负责构建我们需要的报告。

我有很多我运行的报告,当然大多数是针对特定日期等的。编码是在 Windows 2003 Standard Server 机器上的 ASP.net 中运行的 C# 中完成的。它使用 Informix CSDK 通过 CSDK 附带的 .Net 数据适配器进行连接。该服务器在 AIX 5.2 服务器上运行 Informix 10。

奇怪的是,每当我们启动和停止 Informix 或重新启动服务器等时,似乎 Informix 决定改变它通过 CSDK 处理日期的方式。如果它当前期待 MM/DD/YYYY,那么它最终会在上述情况之后决定是否希望它在 YYYY/MM/DD 中​​。这通常最终会给我一个“Invalid Month in Date”错误。然后我进入我的 dateformat 函数(使我可以轻松地来回切换)并手动更改它。我在处理此错误时构建了一些报告,然后使用其他格式的日期重试相同的查询。这当然不太理想,我想深入了解它!

这是 ASP.net 页面错误中的一些粘贴文本。谢谢!

“/”应用程序中的服务器错误。 错误 [HY000] [Informix .NET 提供程序][Informix] 日期月份无效 说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关该错误及其源自代码的位置的更多信息。 异常详细信息:IBM.Data.Informix.IfxException: ERROR [HY000] [Informix .NET provider][Informix]Invalid month in date 源错误: 第 479 行: 第 480 行://aUsage = new IfxDataAdapter(sSelect_Usage, conn); 第 481 行:aUsage.Fill(dsUsage, "Usage"); 第 482 行:aUsage.Dispose(); 第 483 行:dtUsage = dsUsage.Tables["Usage"]; 源文件:D:\Inetpub\reports2.oscarwinski.com\App_Code\IMRShipClass.cs 行:481 堆栈跟踪: [IfxException: 错误 [HY000] [Informix .NET 提供程序][Informix] 日期月份无效] IBM.Data.Informix.IfxConnection.HandleError(IntPtr hHandle, SQL_HANDLE hType, RETCODE retcode) +26 IBM.Data.Informix.IfxCommand.ExecuteReaderObject(CommandBehavior 行为,字符串方法)+654 IBM.Data.Informix.IfxCommand.ExecuteReader(CommandBehavior 行为)+117 IBM.Data.Informix.IfxCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior 行为)+4 System.Data.Common.DbDataAdapter.FillInternal(DataSet 数据集,DataTable[] 数据表,Int32 startRecord,Int32 maxRecords,String srcTable,IDbCommand 命令,CommandBehavior 行为)+130 System.Data.Common.DbDataAdapter.Fill(DataSet dataSet,Int32 startRecord,Int32 maxRecords,String srcTable,IDbCommand 命令,CommandBehavior 行为)+287 System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable) +92 D:\Inetpub\reports2.oscarwinski.com\App_Code\IMRShipClass.cs:481 中的 IMRShipClass.Generate() D:\Inetpub\reports2.oscarwinski.com\IMRShip.aspx.cs:114 中的 IMRShip.testIMR() D:\Inetpub\reports2.oscarwinski.com\IMRShip.aspx.cs:259 中的 IMRShip.btnExport2Excel_Click1(对象发送者,EventArgs e) System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111 System.Web.UI.WebControls.Button.RaisePostBackEvent(字符串 eventArgument)+110 System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(字符串 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(布尔 includeStagesBeforeAsyncPoint,布尔 includeStagesAfterAsyncPoint)+1565 版本信息:Microsoft .NET Framework 版本:2.0.50727.3082; ASP.NET 版本:2.0.50727.3082

【问题讨论】:

    标签: c# asp.net windows informix aix


    【解决方案1】:

    以root而不是informix用户身份启动informix实例......它解决了我的pb和我的夜晚哈哈

    【讨论】:

      【解决方案2】:

      在运行报告的客户端应用程序以及所有其他客户端中设置DBDATE=MDY4/

      【讨论】:

        【解决方案3】:

        DB2/Informix 覆盖客户端日期格式。您联系 Db2 管理员并一次性在服务器端设置日期格式。我们在 AS400 (DB2) 中遇到了完全相同的问题,而 DB 管理员从未像您的情况那样接受它。一旦从 IBM 站点获取 ISO 日期格式语法并将其提供给 DB2 管理员,他就对其进行了更改。之后,我们的程序在日期方面运行良好。
        祝你好运。

        【讨论】:

          【解决方案4】:

          您的特定设置可能不是这种情况,但我看到当管理员将其区域设置设置为与默认设置不同的设置时,服务器会更改报告给数据库的日期格式,但仅在他们登录时! 您可能希望检查系统上每个用户的国家/地区设置。

          【讨论】:

            【解决方案5】:

            这可能无关紧要,但我收到了同样的错误。我最终将 SQL 中的单引号更改为括号。我使用的是参数化 SQL。

            SELECT id, descriptor FROM Foo WHERE descriptor >= '?' 变成了

            SELECT id, descriptor FROM Foo WHERE descriptor >= (?) 
            

            【讨论】:

              【解决方案6】:

              啊! .NET 不是我的强项 - 您可能必须调整我所说的才能正常工作。

              在 Windows 上,无论好坏,都有一个名为 SETNET32 的 Informix 实用程序,可用于为连接到 Informix 数据库的 Windows 程序设置与 Informix 相关的环境变量。你没有提到你是否使用它设置了任何东西。调查 Informix .NET 提供程序是否使用它。

              您也没有提到问题出现时是否重新启动了 AIX 机器上的 IDS 服务器实例。我假设不是。 (如果确实如此,分析可能会有所不同。)

              控制日期格式的主要环境变量是 DBDATE。它采用各种符号,例如:

              DBDATE=dmy4/        # 30/07/2009
              DBDATE=mdy4/        # 07/30/2009
              DBDATE=y4md-        # 2009-07-30
              DBDATE=mdy20        # 073009
              

              不要使用最后一个。如果DBDATE 的值发生变化,这可能说明您的一些问题,设置DBDATE 可能会解决您的问题。

              如果没有设置DBDATE,还有其他变量会影响日期解释;其中包括CLIENT_LOCALEDB_LOCALE,甚至GL_DATE。但是,DBDATE 的优先级最高,也是大多数人最常设置的。

              【讨论】:

              • 奇怪的是,它不是在 windows 服务器重新启动时发生,而是在 AIX 中的 Informix 实例重新启动时发生。
              • @DarkUnderlord:这是奇怪的行为。嗯,我觉得令人费解的是 IDS 运行时的变化——并不是说重启可以改变一切。确保 IDS 始终在相同的环境中启动是相当重要的,以确保在重新启动后获得相同的行为。但这并不能解释 IDS 运行时的明显变化。
              【解决方案7】:

              日期格式由客户端控制,而不是服务器。显然它有一个默认值(美国格式),但每个客户都可以指定它希望使用的格式。这是通过设置DBDATE environment variable 来完成的。 (如果您使用的是语言环境,还有 GL_DATE。)

              如果日期格式已切换,则应检查此环境变量的值。在某些情况下它是由您的中间件设置的吗?

              【讨论】:

              • 有没有办法先显示 DBDATE 的值,然后再改变它。我尝试使用 echo $DBDATE,但是该命令不返回任何内容。我什至找不到默认日期格式是什么?
              猜你喜欢
              • 2018-05-29
              • 1970-01-01
              • 2020-10-18
              • 1970-01-01
              • 1970-01-01
              • 2022-11-22
              • 1970-01-01
              • 2011-09-24
              • 1970-01-01
              相关资源
              最近更新 更多