예제 #1
0
        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);
        }
예제 #2
0
        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);
        }