private int InsertItemForTable(object item, DBTableDesc table, int owner) { List <object> insertParams = new List <object>(); int index; if (table.Primary && ((IDBLoadable)item).DBLoaderID != 0) { index = ((IDBLoadable)item).DBLoaderID; } else { index = GetNextIndex(table); } int count = 1; insertParams.Add(index); if (!table.Primary) { insertParams.Add(owner); count++; } StringBuilder strb = new StringBuilder(); strb.Append("INSERT INTO " + table.Name + "(ID"); if (!table.Primary) { strb.Append(", OwnerID"); } List <DBFieldDesc> subtables = new List <DBFieldDesc>(); foreach (DBFieldDesc field in table.Fields) { if (field.Subtable == null) { strb.Append(", " + field.Name); insertParams.Add(field.Info.GetGetMethod().Invoke(item, new object[] {})); count++; } else { subtables.Add(field); } } strb.Append(") VALUES (?"); for (int i = 1; i < count; i++) { strb.Append(", ?"); } strb.Append(");"); string command = strb.ToString(); sql.ExecuteCommand(command, insertParams.ToArray()); InsertItemSubtables(item, table, index); if (table.Primary) { IDBLoadable loadable = (IDBLoadable)item; loadable.DBLoaderID = index; } return(index); }
private List <object> LoadValues(DBTableDesc table, int owner) { List <object> valueList = new List <object>(); RowsRet ret; if (table.Primary) { ret = sql.ExecuteCommand("SELECT * FROM " + table.Name + ";"); } else { ret = sql.ExecuteCommand("SELECT * FROM " + table.Name + " WHERE OwnerID = ?;", new object[] { owner }); } foreach (Row row in ret.Rows) { ConstructorInfo info = table.Type.GetConstructor(new Type[] { }); Object item = info.Invoke(new object[] {}); int index = row.IntValue("ID"); foreach (DBFieldDesc field in table.ValueFields) { string stringVal = row[field.Name]; object obVal = ParseObjectForType(stringVal, field.Info.PropertyType); field.Info.GetSetMethod().Invoke(item, new object[] { obVal }); } foreach (DBFieldDesc field in table.SubtableFields) { if (IsEnumerationTableType(field.Info.PropertyType)) { List <object> list; if (IsSimpleValueEnumeration(field.Info.PropertyType)) { list = LoadSimpleValues(field.Subtable, index); } else { list = LoadValues(field.Subtable, index); } ConstructorInfo cons = field.Info.PropertyType.GetConstructor(new Type[] { }); IList newList = (IList)cons.Invoke(new object[0]); foreach (object listitem in list) { newList.Add(listitem); } field.Info.GetSetMethod().Invoke(item, new object[] { newList }); } else { List <object> list = LoadValues(field.Subtable, index); if (list.Count > 0) { field.Info.GetSetMethod().Invoke(item, new object[] { list[0] }); } } } if (table.Primary) { IDBLoadable loadable = (IDBLoadable)item; loadable.DBLoaderID = index; } valueList.Add(item); } return(valueList); }