2009-07-30 4 views
2

Nous avons donc un serveur AIX (ugh) qui exécute un système ERP. Les rapports intégrés de ce système sont tellement drôles que je suis bien sûr chargé de construire les rapports dont nous avons besoin.Mois non daté - Le format de date dans Informix est sporadiquement rétabli

J'ai beaucoup de rapports que je cours et bien sûr pour des dates spécifiques, etc. Le codage est fait en C# s'exécutant dans ASP.net sur un Windows 2003 Standard Server. Il utilise l'Informix CSDK pour se connecter via l'adaptateur de données .Net fourni avec le CSDK. Le serveur exécute Informix 10 sur le serveur AIX 5.2. Ce qui est bizarre, c'est que chaque fois que nous démarrons et arrêtons Informix ou redémarrons le serveur, etc., il semble qu'Informix décide de changer la façon dont il a géré la date via le CSDK. S'il attend actuellement MM/JJ/AAAA, il finira par décider après la situation ci-dessus qui le veut en AAAA/MM/JJ. Cela finit généralement par me donner une erreur "Invalid Month in Date". Ensuite, je vais dans ma fonction de format de date (faite pour me permettre facilement de tomber d'avant en arrière) et de le changer manuellement. Un couple de rapports j'ai construit dans la gestion de cette erreur, puis réessayez la même requête avec l'autre format de la date. Ce n'est bien sûr pas idéal et j'aimerais aller au fond des choses!

Voici un texte collé de l'erreur de page ASP.net. Merci!

 
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 

Répondre

1

Le format de la date est contrôlé par le client et non par le serveur. Évidemment, il a une valeur par défaut (format US), mais chaque client peut dicter le format qu'il souhaite utiliser. Ceci est fait en réglant le DBDATE environment variable. (Il existe également GL_DATE si vous utilisez des paramètres régionaux.)

Si le format de date a changé, vous devez vérifier la valeur de cette variable d'environnement. Est-ce que c'est réglé par votre middleware dans certaines circonstances?

+0

Est-il possible d'abord pour afficher la valeur de DBDATE puis de le changer. J'ai essayé avec echo $ DBDATE, cependant la commande ne retourne rien. Je ne trouve même pas quel est le format de date par défaut? – vikifor

0

Urgh! .NET n'est pas mon point fort - vous devrez peut-être adapter ce que je dis pour fonctionner correctement. Sur Windows, pour le meilleur ou pour le pire, il existe un utilitaire Informix appelé SETNET32 qui peut être utilisé pour définir les variables d'environnement liées à Informix pour les programmes Windows qui se connectent aux bases de données Informix. Vous ne mentionnez pas si vous avez défini quelque chose en utilisant ceci. Recherchez s'il est utilisé par le fournisseur Informix .NET.

Vous ne mentionnez pas non plus si l'instance de serveur IDS sur la boîte AIX est redémarrée lorsque le problème apparaît. Je suppose que non. (L'analyse peut être différente si c'est le cas.)

La variable d'environnement principale qui contrôle le format de date est DBDATE. Il prend diverses notations, telles que:

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

N'utilisez pas le dernier. S'il y a des changements dans la valeur de DBDAT E, cela pourrait expliquer certains de vos problèmes, et le réglage DBDATE réglerait probablement vos problèmes.

D'autres variables affectent l'interprétation de la date si DBDATE n'est pas définie; ceux-ci comprennent CLIENT_LOCALE et DB_LOCALE, et même GL_DATE. Cependant, DBDATE a la priorité la plus élevée et est celle que la plupart des gens établissent le plus souvent.

+0

la chose étrange est que cela n'arrive PAS lorsque le serveur Windows est redémarré, mais lorsque l'instance Informix dans AIX est redémarré. – DarkUnderlord

+0

@DarkUnderlord: c'est un comportement étrange. Eh bien, ce que je trouve déroutant, c'est le changement de l'IDS - pas qu'un redémarrage puisse changer les choses. Il est moyennement important que vous vous assuriez que l'IDS est toujours démarré avec le même environnement, afin de garantir le même comportement après le redémarrage. Mais cela n'explique pas le changement apparent pendant l'exécution d'IDS. –

0

Définissez DBDATE=MDY4/ dans l'application cliente qui exécute les rapports et tous les autres clients.

0

Ceci est probablement sans rapport, mais je recevais la même erreur. J'ai fini par changer les guillemets simples dans mon SQL aux parenthèses.J'utilisais le SQL paramétré.

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

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

DB2/Informix remplace le format de la date du client. Vous contactez votre administrateur Db2 et définissez le format de la date sur le serveur une fois pour toutes. Nous avons rencontré exactement le même problème dans AS400 (DB2) et l'administrateur DB ne l'a jamais accepté comme dans votre cas. Une fois que la syntaxe de format de date ISO a été prise du site IBM et donnée à l'administrateur DB2, il l'a modifié. Après cela, nos programmes ont bien fonctionné avec les dates.
Bonne chance.

0

Cela peut ne pas être le cas pour votre configuration particulière, mais j'ai vu des serveurs changer le format de date signalé aux bases de données lorsque les paramètres régionaux des administrateurs ont différé à la valeur par défaut, mais seulement lorsqu'ils sont connectés! Vous souhaiterez peut-être vérifier les paramètres de pays/régionaux pour CHAQUE utilisateur sur le système.

-3

Démarrez l'instance Informix en tant que root au lieu de l'utilisateur Informix .... il résout mon et ma nuit pb lol