예제 #1
0
파일: FieldList.cs 프로젝트: labeuze/source
        private static void DateConvert(Field f, CultureInfo culture)
        {
            string s;
            DateTimeStyles dts;

            dts = DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.NoCurrentDateDefault;
            s = f.TextValue.Trim();
            if (s == "")
            {
                if (!f.IsNullable) throw new FieldException("la valeur du champ \"{0}\" ne peut pas être nulle", f.Name);
                f.Value = null;
            }
            else
            {
                //DateTime dt;
                Date dt;
                bool b;
                if (f.Format == null || f.Format == "")
                    b = Date.TryParse(s, culture, dts, out dt);
                else
                    b = Date.TryParseExact(s, f.Format, culture, dts, out dt);
                if (!b) throw new FieldException("la valeur \"{0}\" du champ \"{1}\" n'est pas une date ou une heure dont le format est \"{2}\"", f.TextValue, f.Name, f.Format);
                //f.Value = (Date)dt;
                f.Value = dt;

                if (f.sqlDbType == SqlDbType.SmallDateTime)
                {
                    //dt = (DateTime)f.Value;
                    //DateTime dtSmallDatetimeMin = new DateTime(1900, 1, 1);
                    //DateTime dtSmallDatetimeMax = new DateTime(2079, 6, 7);
                    Date dtSmallDatetimeMin = new Date(1900, 1, 1);
                    Date dtSmallDatetimeMax = new Date(2079, 6, 7);
                    if (dt < dtSmallDatetimeMin || dt >= dtSmallDatetimeMax)
                    {
                        if (!f.IsNullable)
                            throw new FieldException("la valeur \"{0:dd/MM/yyyy}\" du champ \"{1}\" de type smalldatetime doît être compris entre 01/01/1900 et 06/06/2079", f.Value, f.Name);
                        f.Value = null;
                    }
                }
            }
        }
예제 #2
0
파일: FieldList.cs 프로젝트: labeuze/source
        private static void DecimalConvert(Field f, CultureInfo culture)
        {
            string s;
            NumberStyles ns;

            s = f.TextValue.Trim();
            if (s == "")
            {
                if (!f.IsNullable) throw new FieldException("la valeur du champ \"{0}\" ne peut pas être nulle", f.Name);
                f.Value = null;
            }
            else
            {
                ns = NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowLeadingWhite | NumberStyles.AllowThousands;
                //try
                //{
                //    f.Value = Decimal.Parse(s, ns, culture);
                //}
                //catch (Exception ex)
                //{
                //    throw new FieldException(ex, "la valeur \"{0}\" du champ \"{1}\" n'est pas de type décimal", f.TextValue, f.Name);
                //}
                decimal d;
                if (!decimal.TryParse(s, ns, culture, out d))
                    throw new FieldException("la valeur \"{0}\" du champ \"{1}\" n'est pas de type décimal", f.TextValue, f.Name);
                f.Value = d;
            }
        }
예제 #3
0
파일: FieldList.cs 프로젝트: labeuze/source
 public static void Convert(Field f, CultureInfo culture)
 {
     switch (Type.GetTypeCode(f.Type))
     {
         case TypeCode.Boolean:
             BoolConvert(f);
             break;
         case TypeCode.DateTime:
             DateTimeConvert(f, culture);
             break;
         case TypeCode.Single:
             FloatConvert(f, culture);
             break;
         case TypeCode.Double:
             DoubleConvert(f, culture);
             break;
         case TypeCode.Decimal:
             DecimalConvert(f, culture);
             break;
         case TypeCode.Byte:
             ByteConvert(f);
             break;
         case TypeCode.Int16:
             Int16Convert(f);
             break;
         case TypeCode.Int32:
             Int32Convert(f);
             break;
         case TypeCode.Int64:
             Int64Convert(f);
             break;
         case TypeCode.String:
             StringConvert(f);
             break;
         case TypeCode.Object:
             if (f.Type == typeof(Date))
                 DateConvert(f, culture);
             break;
     }
     if (f.Value == null) f.Value = f.DefaultValue;
 }
예제 #4
0
파일: FieldList.cs 프로젝트: labeuze/source
        private static void BoolConvert(Field f)
        {
            int i;
            string s;

            s = f.TextValue.Trim();
            if (s == "")
            {
                if (!f.IsNullable) throw new FieldException("la valeur du champ \"{0}\" ne peut pas être nulle", f.Name);
                f.Value = null;
            }
            else if (zconvert.IsInt(s))
            {
                //i = zconvert.Int(s);
                i = s.zTryParseAs<int>();
                if (i == 0) f.Value = false; else f.Value = true;
            }
            else
            {
                //try
                //{
                //    f.Value = bool.Parse(f.TextValue);
                //}
                //catch (Exception ex)
                //{
                //    throw new FieldException(ex, "la valeur \"{0}\" du champ \"{1}\" n'est pas un booléen (true, >0, <0, false, 0)", f.TextValue, f.Name);
                //}
                bool bValue;
                if (!bool.TryParse(f.TextValue, out bValue))
                    throw new FieldException("la valeur \"{0}\" du champ \"{1}\" n'est pas un booléen (true, >0, <0, false, 0)", f.TextValue, f.Name);
                f.Value = bValue;
            }
        }
예제 #5
0
파일: FieldList.cs 프로젝트: labeuze/source
		// type possible : int, string, numeric(10,2), varchar(10)
		private void SetFieldType(Field f, string sType)
		{
            int iPrm1 = 0; int iPrm2 = 0;
            string s = sType.Trim();
            string[]  s2 = zsplit.Split(s, new char[] { '(', ')' }, true, false, true);
			if (s2.Length == 0 || s2.Length > 2) goto err;
			s = s2[0];
			if (s2.Length == 2)
			{
                s2 = zsplit.Split(s2[1], ',', true, false, false);
				if (s2.Length == 0 || s2.Length > 2) goto err;
				if (!zconvert.IsInt(s2[0])) goto err;
                //iPrm1 = zconvert.Int(s2[0]);
                iPrm1 = s2[0].zTryParseAs<int>();
                if (s2.Length == 2)
				{
                    if (!zconvert.IsInt(s2[1])) goto err;
                    //iPrm2 = zconvert.Int(s2[1]);
                    iPrm2 = s2[1].zTryParseAs<int>();
				}
			}

            Type type;
            DbType dbType;
            OleDbType oleDbType;
            SqlDbType sqlDbType;
            OdbcType odbcType;
            Type TypeCastBeforeCreateSqlServerType;
            int iSize;
            byte byPrecision;
            byte byScale;
            GetFieldType(s, iPrm1, iPrm2, out type, out dbType, out oleDbType, out sqlDbType, out odbcType, out TypeCastBeforeCreateSqlServerType, out iSize, out byPrecision, out byScale);
			f.Type = type;
			f.dbType = dbType;
			f.oleDbType = oleDbType;
			f.sqlDbType = sqlDbType;
			f.odbcType = odbcType;
            f.TypeCastBeforeCreateSqlServerType = TypeCastBeforeCreateSqlServerType;
			f.Size = iSize;
			f.Precision = byPrecision;
			f.Scale = byScale;
			return;

			err:
			throw new FieldListException("le type \"{0}\" n'est pas correct", sType);
		}
예제 #6
0
파일: FieldList.cs 프로젝트: labeuze/source
 public void FieldConvertion(Field f)
 {
     Field.Convert(f, gCulture);
 }
예제 #7
0
파일: FieldList.cs 프로젝트: labeuze/source
        public Field Add(Field f)
		{
			f.FieldIndex = glField.Count;
			glField.Add(f);
            if (FieldAdded != null) FieldAdded(f);
            return f;
        }
예제 #8
0
파일: FieldList.cs 프로젝트: labeuze/source
        public Field Add()
		{
            Field f = new Field();
			f.FieldIndex = glField.Count;
            //f.Name = "field" + zconvert.s(glField.Count + 1);
            f.Name = "field" + (glField.Count + 1).ToString();
            f.Type = typeof(string);
			f.dbType = DbType.String;
			f.sqlDbType = SqlDbType.VarChar;
			//f.Size = 8000;
			glField.Add(f);
            if (FieldAdded != null) FieldAdded(f);
            return f;
		}
예제 #9
0
파일: FieldList.cs 프로젝트: labeuze/source
        // exemple de sFieldDef :
		// string, int, date, time, bool, varchar(10), numeric(10,2), varchar(10) collate database_default not null, ...
		// nom string, age int, date_naissance date, heure_naissance time, majeur bool
		// nom string, age int, date_naissance date "dd/MM/yyyy", heure_naissance time "hh:mm", majeur bool
		// id int identity not null, 1 nom string, age int, 4 date_naissance date "dd/MM/yyyy", 5 heure_naissance time "hh:mm", 6 majeur bool
		/// <summary>
		/// </summary>
		/// <param name="sFieldDef">description des champs du fichier texte : [numéro d'ordre] [nom] [type [identity] [collate ...] [default value] [[not] null] ["format"]], ...</param>
        /// <param name="bCreateMissingField"></param>
        private void CreateField(string sFieldDef, bool bCreateMissingField)
		{
			int i, j, k, i1, i2, iIdxField;
            char[,] cCharZone = { { '"', '"' }, { '\'', '\'' }, { '(', ')' } };
            string s, sDefaultValue;
			string[] sFieldDef2, sFieldDef3;

            gsOriginalFieldsDefinition = sFieldDef;
            sFieldDef2 = zsplit.Split(sFieldDef, ',', cCharZone);
			if (sFieldDef2.Length == 0)
				throw new FieldListException("aucun champ n'est défini \"{0}\"", sFieldDef);
			iIdxField = 0;
			for (i = 0; i < sFieldDef2.Length; i++)
			{
				sDefaultValue = null;

                sFieldDef3 = zsplit.Split(sFieldDef2[i], ' ', cCharZone, true, false, true);
				if (sFieldDef3.Length == 0) continue;
                Field f = new Field();

				j = StringArrayIndexOf(sFieldDef3, "identity");
				if (j != -1)
				{
					f.Identity = true;
					sFieldDef3 = StringArrayRemove(sFieldDef3, j, 1);
				}

				j = StringArrayIndexOf(sFieldDef3, "collate");
				if (j != -1)
				{
					if (sFieldDef3.Length < j + 2)
						throw new FieldListException("le champ no {0} ne contient pas le nom du jeu de caractète (collate) \"{1}\"", i + 1, sFieldDef);
					f.Collate = sFieldDef3[j + 1];
					sFieldDef3 = StringArrayRemove(sFieldDef3, j, 2);
				}

				j = StringArrayIndexOf(sFieldDef3, "default");
				if (j != -1)
				{
					if (sFieldDef3.Length < j + 2)
						throw new FieldListException("le champ no {0} ne contient pas de valeur par défaut (default) \"{1}\"", i + 1, sFieldDef);
					f.DefaultValueText = sFieldDef3[j + 1];
					sFieldDef3 = StringArrayRemove(sFieldDef3, j, 2);
				}

				j = StringArrayIndexOf(sFieldDef3, "null");
				if (j != -1)
				{
					if (j > 0 && sFieldDef3[j -1].ToLower() == "not")
					{
						f.IsNullable = false;
						k = 2; j--;
					}
					else
					{
						f.IsNullable = true;
						k = 1;
					}
					sFieldDef3 = StringArrayRemove(sFieldDef3, j, k);
				}

				// numéro d'ordre du champ
				i1 = 0;
				if (zconvert.IsInt(sFieldDef3[0]))
				{
                    //j = zconvert.Int(sFieldDef3[0]);
                    j = sFieldDef3[0].zTryParseAs<int>();
                    if (j == 0)
						throw new FieldListException("le numéro d'ordre du champ no {0} ne peut pas être 0 \"{1}\"", i + 1, sFieldDef);
					j--; // base 1 en base 0
					if (j < iIdxField)
						throw new FieldListException("le numéro d'ordre du champ no {0} n'est pas dans l'ordre \"{1}\"", i + 1, sFieldDef);
					if (bCreateMissingField && j > iIdxField)
					{
						for(k = iIdxField; k < j; k++) Add();
					}
					iIdxField = j; i1 = 1;
				}
				f.FieldIndex = iIdxField++;

				// format du champ
				i2 = sFieldDef3.Length - 1;
				if (sFieldDef3.Length >= 2)
				{
					s = sFieldDef3[i2];
                    if ((zstr.left(s, 1) == "\"" && zstr.right(s, 1) == "\"") || (zstr.left(s, 1) == "\'" && zstr.right(s, 1) == "\'"))
                    {
						i2--;
						f.Format = s.Substring(1, s.Length - 2);
					}
				}

				// type du champ
                //if (i1 > i2)
                //    throw new FieldListException("pas de type dans la définition du champ no {0} \"{1}\"", i + 1, sFieldDef);
                //SetFieldType(f, sFieldDef3[i2]);
                //if (f.Type == null)
                //    throw new FieldListException("type incorrect dans la définition du champ no {0} \"{1}\"", i + 1, sFieldDef);

                // nom du champ
                //if (i1 < i2 - 1)
                //    throw new FieldListException("erreur dans la définition du champ no {0} \"{1}\"", i + 1, sFieldDef);
                //if (i1 < i2) f.Name = sFieldDef3[i1];


                // i1 indice du nom, i2 = indice du type

                if (i1 < i2 - 1) // si il y a une autre valeur entre le nom et le type : erreur
                    throw new FieldListException("erreur dans la définition du champ no {0} \"{1}\"", i + 1, sFieldDef);

                if (i1 <= i2)
                {
                    // type du champ
                    SetFieldType(f, sFieldDef3[i2]);
                    if (f.Type == null)
                    {
                        if (i1 < i2) // s'il y a un nom et un type : erreur
                            throw new FieldListException("type incorrect dans la définition du champ no {0} \"{1}\"", i + 1, sFieldDef);
                        SetFieldType(f, "string");
                    }
                    else
                        i2--;
                }
                // nom du champ
                if (i1 <= i2) f.Name = sFieldDef3[i1];

                f.FieldSeparator = null;

				if (f.DefaultValueText != null)
				{
					sDefaultValue = f.DefaultValueText;
					if (sDefaultValue.StartsWith("'") && sDefaultValue.EndsWith("'"))
					{
						sDefaultValue = sDefaultValue.Remove(0, 1);
						sDefaultValue = sDefaultValue.Remove(sDefaultValue.Length - 1, 1);
					}
					f.TextValue = sDefaultValue;
					try
					{
						FieldConvertion(f);
					}
					catch(Exception ex)
					{
						throw new FieldListException(ex, "la valeur par défaut du champ no {0} n'est pas correcte \"{1}\"", i + 1, sFieldDef);
					}
					f.DefaultValue = f.Value;
					f.TextValue = null;
					f.Value = null;

				}

				glField.Add(f);
			}
		}
예제 #10
0
파일: FieldList.cs 프로젝트: labeuze/source
 private static void StringConvert(Field f)
 {
     string s = f.TextValue.TrimEnd();
     f.Value = s;
     if (s.Length > f.iMaxSize) f.iMaxSize = s.Length;
     if (s == "" && f.IsNullable) f.Value = null;
     if (f.Size != 0 && s.Length > f.Size) throw new FieldException("la valeur du champ \"{0}\" a une longueur de {1} caractères qui dépasse la taille du champ ({2})", f.Name, s.Length, f.Size);
 }
예제 #11
0
파일: FieldList.cs 프로젝트: labeuze/source
        private static void Int64Convert(Field f)
        {
            string s;

            s = f.TextValue.Trim();
            if (s == "")
            {
                if (!f.IsNullable) throw new FieldException("la valeur du champ \"{0}\" ne peut pas être nulle", f.Name);
                f.Value = null;
            }
            else
            {
                //try
                //{
                //    f.Value = Int64.Parse(s, NumberStyles.Any);
                //}
                //catch (Exception ex)
                //{
                //    throw new FieldException(ex, "la valeur \"{0}\" du champ \"{1}\" n'est pas un entier (Int64)", f.TextValue, f.Name);
                //}
                long l;
                if (!long.TryParse(s, NumberStyles.Any, NumberFormatInfo.InvariantInfo, out l))
                    throw new FieldException("la valeur \"{0}\" du champ \"{1}\" n'est pas un entier (Int64)", f.TextValue, f.Name);
                f.Value = l;
            }
        }