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; } } } }
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; } }
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; }
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; } }
// 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); }
public void FieldConvertion(Field f) { Field.Convert(f, gCulture); }
public Field Add(Field f) { f.FieldIndex = glField.Count; glField.Add(f); if (FieldAdded != null) FieldAdded(f); return f; }
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; }
// 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); } }
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); }
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; } }