示例#1
0
        public UniqueTable(TableName tname, DataTable table)
        {
            this.TableName = tname;
            this.table     = table;

            int i  = 0;
            int I1 = -1;
            int I2 = -1;

            foreach (DataColumn column in table.Columns)
            {
                if (column.ColumnName == PHYSLOC)
                {
                    this.hasPhysloc = true;
                    colLoc          = column;
                    I1 = i;
                }

                if (column.ColumnName == ROWID)
                {
                    colRowID = column;
                    I2       = i;
                }

                i++;
            }

            this.parimaryKeys = tname.GetTableSchema().PrimaryKeys.Keys;

            if (I2 == -1)
            {
                return;
            }

            i = 0;
            foreach (DataRow row in table.Rows)
            {
                if (I1 != -1)
                {
                    LOC.Add((byte[])row[I1]);
                }

                if (I2 != -1)
                {
                    row[I2] = i++;
                }
            }

            colRowID.ColumnName = ROWID_HEADER;

            if (I1 != -1)
            {
                table.Columns.Remove(colLoc);
            }

            table.AcceptChanges();
        }
示例#2
0
        /// <summary>
        /// Add all columns of table
        /// </summary>
        /// <param name="tname"></param>
        /// <returns></returns>
        public DataFieldCollection Add(TableName tname)
        {
            var meta = tname.GetTableSchema();      //some columns in [this.dataTable] may be from other tables

            Add(meta.NewRow());

            UpdatePrimaryIdentity(tname);

            return(this);
        }
示例#3
0
        /// <summary>
        /// use default locator to save records into database, primary keys must be defined
        /// </summary>
        /// <param name="tableName"></param>
        public TableWriter(TableName tableName)
        {
            this.schema = tableName.GetTableSchema();

            IPrimaryKeys primary = schema.PrimaryKeys;

            if (primary.Length != 0)
            {
                this.locator = new Locator(primary);
            }
        }
示例#4
0
        public void InsertRow(DataRow row)
        {
            List <string> columns = new List <string>();
            List <object> values  = new List <object>();

            List <SqlExpr> where = new List <SqlExpr>();

            var _columns = TableName.GetTableSchema().Columns;

            foreach (DataColumn column in table.Columns)
            {
                object  value   = row[column];
                string  name    = column.ColumnName;
                IColumn _column = _columns[column.ColumnName];

                if (column == colRowID || _column.IsIdentity)
                {
                    continue;
                }

                if (value != DBNull.Value)
                {
                    columns.Add(name);
                    values.Add(value);

                    where.Add(name.Equal(value));
                }
                else if (!_column.Nullable)  //add default value to COLUMN NOT NULL
                {
                    Type type = _column.CType.ToType();
                    value = GetDefault(type);
                    columns.Add(name);
                    values.Add(value);

                    where.Add(name.Equal(value));
                }
            }

            var builder = new SqlBuilder().INSERT(TableName, columns.ToArray()).VALUES(values.ToArray());

            new SqlCmd(builder).ExecuteNonQuery();

            if (colLoc != null)
            {
                builder = new SqlBuilder().SELECT().COLUMNS(PHYSLOC).FROM(TableName).WHERE(where.AND());
                var loc = new SqlCmd(builder).FillObject <byte[]>();
                LOC.Add(loc);

                //todo: load identity
            }

            row[colRowID] = table.Rows.Count - 1; //this will trigger events ColumnChanged or RowChanged
            row.AcceptChanges();
        }
示例#5
0
        public void Validate()
        {
            ITableSchema metaTable = tableName.GetTableSchema();

            foreach (ColumnAdapter column in columns)
            {
                DataField field = column.Field;
                if (field.Saved || field.Primary)
                {
                    IColumn metaColumn = metaTable.Columns[field.Name];

                    if (!metaColumn.Nullable && (column.Value == System.DBNull.Value || column.Value == null))
                    {
                        throw new MessageException("Column[{0}] value cannot be null", field.Name);
                    }

                    if (metaColumn.Oversize(column.Value))
                    {
                        throw new MessageException("Column[{0}] is oversize, limit={1}, actual={2}", field.Name, metaColumn.Length, ((string)(column.Value)).Length);
                    }
                }
            }
        }
示例#6
0
 /// <summary>
 /// use user defined locator to save records into database
 /// </summary>
 /// <param name="tableName"></param>
 /// <param name="locator"></param>
 public TableWriter(TableName tableName, Locator locator)
 {
     this.schema  = tableName.GetTableSchema();
     this.locator = locator;
 }
示例#7
0
        public void UpdatePrimaryIdentity(TableName tableName)
        {
            TableSchema meta = tableName.GetTableSchema();

            UpdatePrimaryIdentity(meta.PrimaryKeys, meta.Identity);
        }
示例#8
0
 public Locator(TableName tname)
     : this(tname.GetTableSchema().PrimaryKeys)
 {
 }