/// <summary> /// Updates the SqlColumnCollection with any changes made since the last call to Refresh. /// Refresh is automatically called once when the SqlTable.Columns collection is read. /// </summary> public void Refresh() { // Force internal refresh of tables table.dmoTable.GetColumns().Refresh(false); // Clear out old list columns = new ArrayList(); for (int i = 0; i < table.dmoTable.GetColumns().GetCount(); i++) { NativeMethods.IColumn dmoColumn = table.dmoTable.GetColumns().Item(i + 1); SqlColumnInformation columnInfo = new SqlColumnInformation(dmoColumn.GetInPrimaryKey(), dmoColumn.GetIdentity(), dmoColumn.GetName(), dmoColumn.GetDatatype(), dmoColumn.GetLength(), dmoColumn.GetNumericScale(), dmoColumn.GetNumericPrecision(), dmoColumn.GetAllowNulls(), dmoColumn.GetDRIDefault().GetText(), dmoColumn.GetIdentitySeed(), dmoColumn.GetIdentityIncrement(), dmoColumn.GetIsRowGuidCol()); SqlColumn column = new SqlColumn(columnInfo); columns.Add(column); column.dmoColumn = dmoColumn; column.table = this.table; } }
/// <summary> /// Adds a new column to the table with specified column information. /// </summary> /// <param name="columnInfo"> /// The column information for the column to add. /// </param> /// <returns> /// If the operation succeeded, the return value is the column created. /// </returns> public SqlColumn Add(SqlColumnInformation columnInfo) { // Do some basic error checking - leave the rest up to DMO if (columnInfo.Name == null || columnInfo.Name.Length == 0) { throw new ArgumentException(SR.GetString("SqlColumnCollection_MustHaveValidName")); } if (columnInfo.DataType == null || columnInfo.DataType.Length == 0) { throw new ArgumentException(SR.GetString("SqlColumnCollection_MustHaveValidDataType")); } if (this[columnInfo.Name] != null) { throw new ArgumentException(String.Format(SR.GetString("SqlColumnCollection_NameAlreadyExists"), columnInfo.Name)); } // Create new DMO column NativeMethods.IColumn dmoColumn = (NativeMethods.IColumn) new NativeMethods.Column(); dmoColumn.SetName(columnInfo.Name); dmoColumn.SetDatatype(columnInfo.DataType); dmoColumn.SetLength(columnInfo.Size); dmoColumn.SetAllowNulls(columnInfo.Nulls); dmoColumn.SetNumericPrecision(columnInfo.Precision); dmoColumn.SetNumericScale(columnInfo.Scale); dmoColumn.SetIdentity(columnInfo.Identity); dmoColumn.SetIdentitySeed(columnInfo.IdentitySeed); dmoColumn.SetIdentityIncrement(columnInfo.IdentityIncrement); dmoColumn.SetIsRowGuidCol(columnInfo.IsRowGuid); dmoColumn.GetDRIDefault().SetText(columnInfo.DefaultValue); // Physically add the column table.dmoTable.BeginAlter(); table.dmoTable.GetColumns().Add(dmoColumn); table.dmoTable.DoAlter(); // If this column is to be included in the primary key, do some stuff if (columnInfo.Key) { // Find out if there is a primary key... NativeMethods.IKey primaryKey = null; NativeMethods.IKeys keys = table.dmoTable.GetKeys(); for (int i = 0; i < keys.GetCount(); i++) { if (keys.Item(i + 1).GetType() == NativeMethods.SQLDMO_KEY_TYPE.SQLDMOKey_Primary) { primaryKey = keys.Item(i + 1); break; } } if (primaryKey != null) { // If there is a primary key, just add the column to the list of columns } else { // If there is no primary key, create new primary key and add thie column as the only column primaryKey = (NativeMethods.IKey) new NativeMethods.Key(); primaryKey.SetType(NativeMethods.SQLDMO_KEY_TYPE.SQLDMOKey_Primary); primaryKey.GetKeyColumns().Add(columnInfo.Name); table.dmoTable.GetKeys().Add(primaryKey); } } // Read the data back out columnInfo = new SqlColumnInformation(dmoColumn.GetInPrimaryKey(), dmoColumn.GetIdentity(), dmoColumn.GetName(), dmoColumn.GetDatatype(), dmoColumn.GetLength(), dmoColumn.GetNumericScale(), dmoColumn.GetNumericPrecision(), dmoColumn.GetAllowNulls(), dmoColumn.GetDRIDefault().GetText(), dmoColumn.GetIdentitySeed(), dmoColumn.GetIdentityIncrement(), dmoColumn.GetIsRowGuidCol()); SqlColumn column = new SqlColumn(columnInfo); // Set internal properties column.dmoColumn = dmoColumn; column.table = this.table; // Add to private list columns.Add(column); return(column); }