internal string Insert(Table table,out List<IDbDataParameter> insertParameters) { sTable tbl = _pool.Mapping[table.GetType()]; insertParameters=new List<IDbDataParameter>(); List<string> fprops = new List<string>(tbl.ForeignTableProperties); try{ string values=""; string parameters=""; foreach (string prop in tbl.Properties) { sTableField[] flds = tbl[prop]; if (flds.Length > 0) { PropertyInfo pi = table.GetType().GetProperty(prop, Utility._BINDING_FLAGS); if (pi == null) pi = table.GetType().GetProperty(prop, Utility._BINDING_FLAGS_WITH_INHERITANCE); if ((fprops.Contains(prop)||pool.Mapping.IsMappableType(pi.PropertyType)) && !Utility.IsEnum(pi.PropertyType)) { Table eTable = (Table)table.GetField(prop); if (eTable == null) { foreach (sTableField fld in flds) { values += fld.Name + ","; parameters += "," + CreateParameterName(fld.Name); insertParameters.Add(pool.CreateParameter(CreateParameterName(fld.Name), null, fld.Type, fld.Length)); } } else { foreach (sTableField fld in flds) { values += fld.Name + ","; parameters += "," + CreateParameterName(fld.Name); } Type etype = pi.PropertyType; while (true) { sTable etbl = _pool.Mapping[etype]; foreach (sTableField fld in flds) { foreach (sTableField efld in etbl.Fields) { if (fld.ExternalField == efld.Name) { insertParameters.Add(pool.CreateParameter(CreateParameterName(fld.Name),QueryBuilder.LocateFieldValue(eTable,efld,pool))); break; } } } etype = etype.BaseType; if (etype.Equals(typeof(Table))) break; } } } else if (!Utility.StringsEqual(prop,tbl.AutoGenProperty) && flds[0].ComputedCode==null) { values += flds[0].Name + ","; parameters += "," + CreateParameterName(flds[0].Name); if (table.IsFieldNull(prop)) insertParameters.Add(pool.CreateParameter(CreateParameterName(flds[0].Name), null, flds[0].Type, flds[0].Length)); else { if (flds[0].Type == FieldType.ENUM) insertParameters.Add(pool.CreateParameter(CreateParameterName(flds[0].Name), pool.GetEnumID(table.GetType().GetProperty(prop, Utility._BINDING_FLAGS_WITH_INHERITANCE).PropertyType, table.GetField(prop).ToString()))); else insertParameters.Add(pool.CreateParameter(CreateParameterName(flds[0].Name), table.GetField(prop), flds[0].Type, flds[0].Length)); } } } } values=values.Substring(0,values.Length-1); parameters=parameters.Substring(1); if (tbl.AutoGenProperty != null) { string select = ""; for (int x = 0; x < insertParameters.Count; x++) { for (int y = x + 1; y < insertParameters.Count; y++) { if (insertParameters[x].ParameterName == insertParameters[y].ParameterName) { insertParameters.RemoveAt(y); y--; } } } insertParameters.Add(pool.CreateParameter(CreateParameterName(tbl.AutoGenField), table.GetField(tbl.AutoGenProperty), tbl[tbl.AutoGenProperty][0].Type, tbl[tbl.AutoGenProperty][0].Length)); if (tbl[tbl.AutoGenProperty][0].Type == FieldType.STRING) insertParameters[insertParameters.Count - 1].Size = int.MaxValue; select = _GenerateAutogenIDQuery(tbl, ref insertParameters); if (pool is MsSqlConnectionPool && select.StartsWith("OUTPUT")) return string.Format(InsertString, tbl.Name, values, parameters).Replace(" VALUES ", " " + select + " VALUES "); else return string.Format(InsertString, tbl.Name, values, parameters) + " " + select; } return string.Format(InsertString,tbl.Name,values,parameters); }catch (Exception e) { Logger.LogLine(e.Message); return null; } }
internal string InsertWithIdentity(Table table, out List<IDbDataParameter> insertParameters) { sTable tbl = _pool.Mapping[table.GetType()]; insertParameters = new List<IDbDataParameter>(); try { string values = ""; string parameters = ""; foreach (string prop in tbl.Properties) { sTableField[] flds = tbl[prop]; if (flds.Length > 0) { PropertyInfo pi = table.GetType().GetProperty(prop, Utility._BINDING_FLAGS); if (pi.GetCustomAttributes(false)[0] is Org.Reddragonit.Dbpro.Structure.Attributes.IForeignField) { Table eTable = (Table)table.GetField(prop); if (eTable == null) { foreach (sTableField fld in flds) { values += fld.Name + ","; parameters += "," + CreateParameterName(fld.Name); insertParameters.Add(pool.CreateParameter(CreateParameterName(fld.Name), null, fld.Type, fld.Length)); } } else { foreach (sTableField fld in flds) { values += fld.Name + ","; parameters += "," + CreateParameterName(fld.Name); } Type etype = pi.PropertyType; while (true) { sTable etbl = _pool.Mapping[etype]; foreach (sTableField fld in flds){ foreach (sTableField efld in etbl.Fields) { if (fld.ExternalField == efld.Name) { object val = LocateFieldValue(eTable, fld, pool); if (val==null) insertParameters.Add(pool.CreateParameter(CreateParameterName(fld.Name), null, fld.Type, fld.Length)); else insertParameters.Add(pool.CreateParameter(CreateParameterName(fld.Name), val)); break; } } } etype = etype.BaseType; if (etype.Equals(typeof(Table))) break; } } }else { values += flds[0].Name + ","; parameters += "," + CreateParameterName(prop); if (table.IsFieldNull(prop)) insertParameters.Add(pool.CreateParameter(CreateParameterName(prop), null, flds[0].Type, flds[0].Length)); else { if (flds[0].Type == FieldType.ENUM) insertParameters.Add(pool.CreateParameter(CreateParameterName(prop), pool.GetEnumID(table.GetType().GetProperty(prop, Utility._BINDING_FLAGS).PropertyType, table.GetField(prop).ToString()))); else insertParameters.Add(pool.CreateParameter(CreateParameterName(prop), table.GetField(prop), flds[0].Type, flds[0].Length)); } } } } values = values.Substring(0, values.Length - 1); parameters = parameters.Substring(1); return string.Format(InsertString, tbl.Name, values, parameters); } catch (Exception e) { Logger.LogLine(e.Message); return null; } }