2009-07-30 16 views
2

Wir haben also einen AIX (ugh) -Server, der ein ERP-System ausführt. Die eingebauten Berichte dieses Systems sind so schlecht, dass ich natürlich die Aufgabe habe, die Berichte zu erstellen, die wir brauchen.Ungültiger Monat im Datum - Datumsformat in Informix wird sporadisch zurückgesetzt

Ich habe viele Berichte, die ich laufe und die meisten natürlich sind für bestimmte Daten, etc. Die Codierung erfolgt in C# läuft in ASP.net auf einem Windows 2003 Standard Server-Feld. Es verwendet den Informix CSDK, um eine Verbindung über den .Net-Datenadapter herzustellen, der mit dem CSDK geliefert wird. Der Server führt Informix 10 auf dem AIX 5.2-Server aus.

Was ist seltsam ist, dass, wann immer wir Informix starten oder stoppen oder den Server usw. neu starten, es scheint, dass Informix beschließt, die Art, wie es das Datum über die CSDK behandelt. Wenn es momentan MM/TT/JJJJ erwartet, wird es nach der obigen Situation, die es wünscht, in JJJJ/MM/TT entscheiden. Dies führt normalerweise dazu, dass ich den Fehler "Ungültiger Monat im Datum" erhalte. Dann gehe ich in meine Dateformat-Funktion (gemacht, um mich leicht hin und her fallen zu lassen) und manuell zu ändern. Ein paar Berichte, die ich bei der Behandlung dieses Fehlers erstellt habe, und dann die gleiche Abfrage mit dem anderen Format des Datums wiederholen. Das ist natürlich alles andere als ideal und ich möchte dem auf den Grund gehen!

Hier ist ein paar eingefügten Text von der ASP.net-Seite Fehler. Vielen Dank!

 
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 

Antwort

1

Das Datumsformat wird vom Client und nicht vom Server gesteuert. Offensichtlich hat es einen Standard (US-Format), aber jeder Client kann das Format diktieren, das er verwenden möchte. Dies geschieht durch Setzen der DBDATE environment variable. (Wenn Sie Gebietsschemas verwenden, gibt es auch GL_DATE.)

Wenn das Datumsformat gewechselt hat, sollten Sie den Wert dieser Umgebungsvariablen überprüfen. Wird es unter Umständen von Ihrer Middleware gesetzt?

+0

Gibt es eine Möglichkeit zuerst den Wert von DbDate anzuzeigen, und dann, es zu ändern. Ich habe versucht mit echo $ DBDATE, aber der Befehl gibt nichts zurück. Ich kann nicht finden, was ist das Standard-Datumsformat? – vikifor

0

Urgh! .NET ist nicht meine Stärke - Sie müssen möglicherweise anpassen, was ich sage, um richtig zu arbeiten.

Unter Windows gibt es zum Besseren oder Schlechteren ein Informix-Dienstprogramm namens SETNET32, mit dem Informix-bezogene Umgebungsvariablen für Windows-Programme festgelegt werden können, die eine Verbindung mit Informix-Datenbanken herstellen. Sie erwähnen nicht, ob Sie irgendetwas damit eingestellt haben. Untersuchen Sie, ob es vom Informix .NET-Provider verwendet wurde.

Sie erwähnen auch nicht, ob die IDS-Serverinstanz in der AIX-Box neu gestartet wird, wenn das Problem auftritt. Ich vermute nicht. (Die Analyse könnte anders sein, wenn dies der Fall ist.)

Die Hauptumgebungsvariable, die das Datumsformat steuert, ist DBDATE. Es braucht verschiedene Schreibweisen, wie zum Beispiel:

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

Verwenden Sie nicht die letzte. Wenn sich der Wert von DBDAT E ändert, könnte dies einige Ihrer Probleme erklären, und die Einstellung DBDATE würde wahrscheinlich Ihre Probleme beheben.

Es gibt andere Variablen, die die Datumsinterpretation beeinflussen, wenn DBDATE nicht gesetzt ist; diese umfassen CLIENT_LOCALE und DB_LOCALE und sogar GL_DATE. DBDATE hat jedoch die höchste Priorität und ist diejenige, die am häufigsten eingestellt wird.

+0

das seltsame ist, dass es nicht passiert, wenn der Windows-Server neu gestartet wird, aber wenn die Informix-Instanz in AIX neu gestartet wird. – DarkUnderlord

+0

@DarkUnderlord: das ist ungerade Verhalten. Nun, was ich rätselhaft finde, ist die Änderung, während IDS läuft - nicht dass ein Neustart die Dinge ändern kann. Es ist einigermaßen wichtig, dass Sie sicherstellen, dass IDS immer mit derselben Umgebung gestartet wird, um sicherzustellen, dass Sie nach dem Neustart dasselbe Verhalten erhalten. Aber das erklärt nicht die offensichtliche Veränderung, während IDS läuft. –

0

Setzen Sie DBDATE=MDY4/ in der Client-App, die die Berichte und alle anderen Clients ausführt.

0

Dies ist wahrscheinlich nicht verwandt, aber ich erhielt den gleichen Fehler. Am Ende änderte ich die einfachen Anführungszeichen in meinem SQL in Klammern.Ich habe parametrisiertes SQL verwendet.

SELECT id, descriptor FROM Foo WHERE descriptor >= '?' wird

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

DB2/Informix das Client Datumsformat überschreibt. Sie wenden sich an Ihren Db2-Administrator und legen das Datumsformat einmal auf der Server-Seite fest. Wir hatten genau dasselbe Problem in AS400 (DB2) und der DB-Administrator hat es nie akzeptiert wie in Ihrem Fall. Sobald die Syntax des ISO-Datumsformats vom IBM-Standort übernommen und an DB2 admin übergeben wurde, hat er sie geändert. Danach haben unsere Programme mit Daten gut funktioniert.
Viel Glück.

0

Dies ist möglicherweise nicht der Fall für Ihre spezielle Einrichtung, aber ich habe gesehen, Server das Datumsformat in Datenbanken gemeldet geändert, wenn Administratoren ihre Ländereinstellung auf etwas anders als die Standardeinstellung festgelegt haben, aber nur während sie angemeldet sind! Möglicherweise möchten Sie die Ländereinstellungen für jeden Benutzer im System überprüfen.

-3
die Informix-Instanz als Root-Benutzer statt Informix starten

.... es löst meine pb und meine Nacht lol