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; } }
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); }
protected abstract void LoadTableDef(InDbTableDef tableDef);
protected internal abstract void ApplyTableStructure(InDbTableDef tableDef);
protected void CreateTable(InDbTableDef tableDef) { }