protected void CreateTable(InDbTableDef tableDef)
        {
            StringCollection stringCollection = new StringCollection();

            foreach (InDbFieldDef fieldDef in tableDef.FieldDefs)
            {
                stringCollection.Add(string.Format("[{0}] {1}", (object)fieldDef.Name, (object)InDbSqlDatabase.InDbFieldDefToSqlDataType(fieldDef)));
            }
            string str = string.Format("CREATE TABLE {0}.[{1}] ({2}", (object)this.GetSchemaName(), (object)tableDef.Name, (object)StrUtils.Join((IList)stringCollection, "{0}", ","));

            if (tableDef.PrimaryKey != null)
            {
                str = str + ", PRIMARY KEY (" + StrUtils.Join((IList)tableDef.PrimaryKey.FieldDefs.GetFieldNames(), "[{0}]", ",") + ")";
            }
            this.Execute(str + ")");
            try
            {
                for (int index = 0; index < tableDef.IndexDefs.Count; ++index)
                {
                    InDbIndexDef indexDef = tableDef.IndexDefs[index];
                    if (indexDef != tableDef.PrimaryKey)
                    {
                        indexDef.FName = "Index" + (object)index;
                        this.CreateIndex(tableDef.Name, indexDef);
                    }
                }
            }
            catch (Exception ex)
            {
                this.DeleteTable(tableDef.Name);
                throw;
            }
        }
예제 #2
0
        public InDbTableDef GetTableDef(string tableName)
        {
            InDbTableDef tableDef = this.TableExists(tableName) ? new InDbTableDef(this, tableName, false) : throw new InDbException(string.Format("Ошибка загрузки структуры таблицы {0}: таблица не существует.", (object)tableName));

            this.LoadTableDef(tableDef);
            return(tableDef);
        }
 private void UpdateTableStructure(InDbTableDef tableDef)
 {
     if (!tableDef.Modified)
     {
         return;
     }
     this.RestructureTable(tableDef);
 }
        private void LoadIndexDefs(InDbTableDef tableDef)
        {
            SqlCommand command = this.Connection.CreateCommand();

            command.CommandText = string.Format("EXEC sp_indexes_rowset @table_name = '{0}', @table_schema = '{1}'", (object)tableDef.Name, (object)this.GetSchemaName());
            Hashtable hashtable = new Hashtable();
            string    str1      = string.Empty;

            using (IDataReader dataReader = (IDataReader)command.ExecuteReader())
            {
                while (dataReader.Read())
                {
                    string str2  = dataReader.GetString(dataReader.GetOrdinal("INDEX_NAME"));
                    string str3  = dataReader.GetString(dataReader.GetOrdinal("COLUMN_NAME"));
                    int    index = dataReader.GetInt32(dataReader.GetOrdinal("ORDINAL_POSITION")) - 1;
                    if (Convert.ToInt32(dataReader.GetValue(dataReader.GetOrdinal("PRIMARY_KEY"))) != 0)
                    {
                        str1 = str2;
                    }
                    StringCollection stringCollection = (StringCollection)hashtable[(object)str2];
                    if (stringCollection == null)
                    {
                        stringCollection = new StringCollection();
                        hashtable.Add((object)str2, (object)stringCollection);
                    }
                    while (index > stringCollection.Count - 1)
                    {
                        stringCollection.Add(string.Empty);
                    }
                    if (stringCollection[index] == str3)
                    {
                        throw new InDbException(string.Format("Столбец {0} входит более одного раза в индекс {1}.", (object)str3, (object)str2));
                    }
                    stringCollection[index] = str3;
                }
            }
            foreach (string key in (IEnumerable)hashtable.Keys)
            {
                StringCollection stringCollection = (StringCollection)hashtable[(object)key];
                string[]         array            = new string[stringCollection.Count];
                stringCollection.CopyTo(array, 0);
                InDbFieldDefs fieldDefs = new InDbFieldDefs((InDbDatabase)this);
                foreach (string name in stringCollection)
                {
                    fieldDefs.Add(tableDef.FieldDefs[name]);
                }
                InDbIndexDef indexDef = new InDbIndexDef(key, fieldDefs);
                tableDef.IndexDefs.Add(indexDef);
                if (key == str1)
                {
                    tableDef.OriginalPrimaryKey = indexDef;
                    tableDef.PrimaryKey         = indexDef;
                }
            }
        }
 protected internal override void ApplyTableStructure(InDbTableDef tableDef)
 {
     if (StrUtils.IsNullOrEmpty(tableDef.OriginalName))
     {
         this.CreateTable(tableDef);
     }
     else
     {
         this.UpdateTableStructure(tableDef);
     }
     if (tableDef.PrimaryKey == null)
     {
         return;
     }
     tableDef.PrimaryKey.FName = this.GetPrimaryIndexName(tableDef);
 }
        private string GetPrimaryIndexName(InDbTableDef tableDef)
        {
            SqlCommand command = this.Connection.CreateCommand();

            command.CommandText = string.Format("EXEC sp_indexes_rowset @table_name = '{0}', @table_schema = '{1}'", (object)tableDef.Name, (object)this.GetSchemaName());
            using (IDataReader dataReader = (IDataReader)command.ExecuteReader())
            {
                while (dataReader.Read())
                {
                    string str = dataReader.GetString(dataReader.GetOrdinal("INDEX_NAME"));
                    if (Convert.ToInt32(dataReader.GetValue(dataReader.GetOrdinal("PRIMARY_KEY"))) != 0)
                    {
                        return(str);
                    }
                }
            }
            return(string.Empty);
        }
        private void RestructureTable(InDbTableDef tableDef)
        {
            InDbTableDef tableDef1 = new InDbTableDef((InDbDatabase)this, this.GetTempTableName(tableDef.Name), true);

            foreach (InDbFieldDef fieldDef in tableDef.FieldDefs)
            {
                tableDef1.FieldDefs.Add(fieldDef);
            }
            foreach (InDbIndexDef indexDef in tableDef.IndexDefs)
            {
                tableDef1.IndexDefs.Add(indexDef);
            }
            tableDef1.PrimaryKey = tableDef.PrimaryKey;
            this.CreateTable(tableDef1);
            try
            {
                StringCollection stringCollection1 = new StringCollection();
                StringCollection stringCollection2 = new StringCollection();
                foreach (InDbFieldDef fieldDef in tableDef.FieldDefs)
                {
                    if (!StrUtils.IsNullOrEmpty(fieldDef.OriginalName))
                    {
                        stringCollection1.Add(fieldDef.OriginalName);
                        stringCollection2.Add(fieldDef.Name);
                    }
                }
                this.Execute(string.Format("INSERT INTO {0}.[{1}] ({2}) SELECT {3} FROM {0}.[{4}] A", (object)this.GetSchemaName(), (object)tableDef1.Name, (object)StrUtils.Join((IList)stringCollection2, "[{0}]", ", "), (object)StrUtils.Join((IList)stringCollection1, "A.[{0}]", ", "), (object)tableDef.OriginalName));
                if (!this.SameIdentifiers(tableDef.OriginalName, tableDef.Name) && this.TableExists(tableDef.Name))
                {
                    throw new InDbException(string.Format("Ошибка модификации таблицы {0}->{1}: таблица {1} уже существует.", (object)tableDef.OriginalName, (object)tableDef.Name));
                }
                this.DeleteTable(tableDef.OriginalName);
            }
            catch (Exception ex)
            {
                this.DeleteTable(tableDef1.Name);
                throw;
            }
            this.RenameTable(tableDef1.Name, tableDef.Name);
        }
        private void LoadFieldDefs(InDbTableDef tableDef)
        {
            SqlCommand command = this.Connection.CreateCommand();

            command.CommandText = string.Format("SELECT\tCOLUMN_NAME, IS_NULLABLE, CHARACTER_MAXIMUM_LENGTH,  DATA_TYPE, NUMERIC_PRECISION, NUMERIC_SCALE  FROM INFORMATION_SCHEMA.COLUMNS  WHERE TABLE_NAME = '{0}' AND TABLE_SCHEMA = '{1}'  ORDER BY ORDINAL_POSITION", (object)tableDef.Name, (object)this.GetSchemaName());
            using (IDataReader dataReader = (IDataReader)command.ExecuteReader())
            {
                object[] values = new object[6];
                while (dataReader.Read())
                {
                    dataReader.GetValues(values);
                    int      size         = 0;
                    string   name         = values[0].ToString();
                    DataType inDbDataType = InDbSqlDatabase.SqlDataTypeToInDbDataType(values[3].ToString(), values[5] == DBNull.Value ? 0 : Convert.ToInt32(values[5]));
                    if (inDbDataType == DataType.String)
                    {
                        size = values[2] == DBNull.Value ? 0 : Convert.ToInt32(values[2]);
                    }
                    tableDef.FieldDefs.Add(new InDbFieldDef(name, inDbDataType, size, false));
                }
            }
        }
 protected override void LoadTableDef(InDbTableDef tableDef)
 {
     this.LoadFieldDefs(tableDef);
     this.LoadIndexDefs(tableDef);
 }
예제 #10
0
 protected abstract void LoadTableDef(InDbTableDef tableDef);
예제 #11
0
 protected internal abstract void ApplyTableStructure(InDbTableDef tableDef);
 protected void CreateTable(InDbTableDef tableDef)
 {
 }