diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Database.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Database.cs index 27f998741c..1faa62b9a0 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Database.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Database.cs @@ -22,6 +22,8 @@ namespace ICSharpCode.Data.Core.DatabaseObjects private DatabaseObjectBase _tables = null; private DatabaseObjectBase _views = null; private DatabaseObjectBase _procedures = null; + private DatabaseObjectBase _constraints = null; + private DatabaseObjectBase _userDefinedDataTypes = null; #endregion @@ -70,6 +72,28 @@ namespace ICSharpCode.Data.Core.DatabaseObjects } } + public DatabaseObjectsCollection Constraints + { + get + { + if (_constraints != null) + return _constraints.Items; + else + return null; + } + } + + public DatabaseObjectsCollection UserDefinedDataTypes + { + get + { + if (_userDefinedDataTypes != null) + return _userDefinedDataTypes.Items; + else + return null; + } + } + #endregion #region Constructor @@ -87,11 +111,19 @@ namespace ICSharpCode.Data.Core.DatabaseObjects { try { + _constraints = new DatabaseObjectBase(); + _constraints.Name = "Constraints"; + + _userDefinedDataTypes = new DatabaseObjectBase(); + _userDefinedDataTypes.Name = "UserDefinedDataTypes"; + _tables = new DatabaseObjectBase(); _tables.Name = "Tables"; _tables.Items = Datasource.DatabaseDriver.LoadTables(this); Items.Add(_tables); OnPropertyChanged("Tables"); + OnPropertyChanged("Constraints"); + OnPropertyChanged("UserDefinedDataTypes"); _views = new DatabaseObjectBase(); _views.Name = "Views"; diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/UserDefinedDataType.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/UserDefinedDataType.cs new file mode 100644 index 0000000000..be8ee583dc --- /dev/null +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/UserDefinedDataType.cs @@ -0,0 +1,57 @@ +#region Usings + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ICSharpCode.Data.Core.Interfaces; + +#endregion + +namespace ICSharpCode.Data.Core.DatabaseObjects +{ + public class UserDefinedDataType : DatabaseObjectBase, IUserDefinedDataType + { + #region Fields + + private string _systemType = string.Empty; + private int _length = 0; + private bool _isNullable = false; + + #endregion + + #region Properties + + public string SystemType + { + get { return _systemType; } + set + { + _systemType = value; + OnPropertyChanged("SystemType"); + } + } + + public int Length + { + get { return _length; } + set + { + _length = value; + OnPropertyChanged("Length"); + } + } + + public bool IsNullable + { + get { return _isNullable; } + set + { + _isNullable = value; + OnPropertyChanged("IsNullable"); + } + } + + #endregion + } +} diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/ICSharpCode.Data.Core.csproj b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/ICSharpCode.Data.Core.csproj index 90b3716651..9566fc780a 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/ICSharpCode.Data.Core.csproj +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/ICSharpCode.Data.Core.csproj @@ -83,6 +83,7 @@ + @@ -97,6 +98,7 @@ + diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/Interfaces/IDatabase.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/Interfaces/IDatabase.cs index b2f996b4b7..99d311eccd 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/Interfaces/IDatabase.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/Interfaces/IDatabase.cs @@ -18,6 +18,8 @@ namespace ICSharpCode.Data.Core.Interfaces DatabaseObjectsCollection Tables { get; } DatabaseObjectsCollection Views { get; } DatabaseObjectsCollection Procedures { get; } + DatabaseObjectsCollection Constraints { get; } + DatabaseObjectsCollection UserDefinedDataTypes { get; } bool LoadDatabase(); } diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/Interfaces/IUserDefinedDataType.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/Interfaces/IUserDefinedDataType.cs new file mode 100644 index 0000000000..07c16dfbdd --- /dev/null +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/Interfaces/IUserDefinedDataType.cs @@ -0,0 +1,18 @@ +#region Usings + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +#endregion + +namespace ICSharpCode.Data.Core.Interfaces +{ + public interface IUserDefinedDataType : IDatabaseObjectBase + { + string SystemType { get; set; } + int Length { get; set; } + bool IsNullable { get; set; } + } +} diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/DisplayBinding/EDMDesignerViewContent.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/DisplayBinding/EDMDesignerViewContent.cs index 30e7dde7c1..d69232dfcb 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/DisplayBinding/EDMDesignerViewContent.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/DisplayBinding/EDMDesignerViewContent.cs @@ -112,7 +112,7 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding // Load or generate DesignerView and EntityTypeDesigners EntityTypeDesigner.Init = true; - if (edmxElement.Element("DesignerViews") == null) + if (edmxElement == null || edmxElement.Element("DesignerViews") == null) edmxElement = new XElement("Designer", DesignerIO.GenerateNewDesignerViewsFromCSDLView(_edmView.CSDL)); if (edmxElement != null && edmxElement.Element("DesignerViews") != null) diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.SQLServer/SQLServerDatabaseDriver.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.SQLServer/SQLServerDatabaseDriver.cs index fcdb104e06..8b3c259c30 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.SQLServer/SQLServerDatabaseDriver.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.SQLServer/SQLServerDatabaseDriver.cs @@ -107,6 +107,7 @@ namespace ICSharpCode.Data.Core.DatabaseDrivers.SQLServer ORDER BY 1,2,3,4"; + private const string _getUserDefinedDataTypes = @"SELECT t1.*, t2.Name AS SystemType FROM sys.Types t1, sys.types t2 WHERE t1.is_user_defined = 1 AND t2.system_type_id = t1.system_type_id AND t2.user_type_id = t1.system_type_id"; private const string _getViews = @"SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='VIEW' AND TABLE_NAME<>'dtproperties' ORDER BY TABLE_SCHEMA, TABLE_NAME"; private const string _getProcedures = "SELECT ROUTINE_NAME, ROUTINE_SCHEMA, ROUTINE_BODY, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'PROCEDURE'"; private const string _getProcedureParameters = @"SELECT PARAMETER_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, PARAMETER_MODE, IS_RESULT FROM information_schema.PARAMETERS WHERE SPECIFIC_NAME = '{0}' AND SPECIFIC_SCHEMA = '{1}' AND SPECIFIC_CATALOG = '{2}'"; @@ -259,17 +260,11 @@ namespace ICSharpCode.Data.Core.DatabaseDrivers.SQLServer SqlConnection sqlConnection = new SqlConnection(database.ConnectionString); - using (SqlDataAdapter da = new SqlDataAdapter(_getTables, sqlConnection)) + using (SqlDataAdapter da = new SqlDataAdapter(_getConstraintsScript, sqlConnection)) { - DataTable dtTables = new DataTable("Tables"); - da.Fill(dtTables); - - da.SelectCommand = new SqlCommand(_getConstraintsScript, sqlConnection); DataTable dtConstraints = new DataTable("Constraints"); da.Fill(dtConstraints); - ObservableCollection constraints = new ObservableCollection(); - for (int i = 0; i < dtConstraints.Rows.Count; i++) { IConstraint constraint = new ICSharpCode.Data.Core.DatabaseObjects.Constraint(); @@ -279,8 +274,32 @@ namespace ICSharpCode.Data.Core.DatabaseDrivers.SQLServer constraint.PKTableName = (string)dtConstraints.Rows[i]["PKTable"]; constraint.PKColumnName = (string)dtConstraints.Rows[i]["PKColumn"]; - constraints.Add(constraint); + database.Constraints.Add(constraint); } + } + + using (SqlDataAdapter da = new SqlDataAdapter(_getUserDefinedDataTypes, sqlConnection)) + { + DataTable dtUserDefinedDataTypes = new DataTable("UserDefinedDataTypes"); + da.Fill(dtUserDefinedDataTypes); + + for (int i = 0; i < dtUserDefinedDataTypes.Rows.Count; i++) + { + IUserDefinedDataType userDefinedDataType = new UserDefinedDataType(); + userDefinedDataType.Name = (string)dtUserDefinedDataTypes.Rows[i]["Name"]; + userDefinedDataType.SystemType = (string)dtUserDefinedDataTypes.Rows[i]["SystemType"]; + userDefinedDataType.Length = Convert.ToInt32(dtUserDefinedDataTypes.Rows[i]["Max_Length"]); + userDefinedDataType.IsNullable = (bool)dtUserDefinedDataTypes.Rows[i]["Is_Nullable"]; + + database.UserDefinedDataTypes.Add(userDefinedDataType); + } + + } + + using (SqlDataAdapter da = new SqlDataAdapter(_getTables, sqlConnection)) + { + DataTable dtTables = new DataTable("Tables"); + da.Fill(dtTables); for (int i = 0; i < dtTables.Rows.Count; i++) { @@ -290,7 +309,7 @@ namespace ICSharpCode.Data.Core.DatabaseDrivers.SQLServer Table table = new Table() { SchemaName = schemaName, TableName = tableName }; LoadColumns(sqlConnection, table, TableType.Table); - table.Constraints = constraints.Where(constraint => constraint.FKTableName == tableName).ToDatabaseObjectsCollection(table); + table.Constraints = database.Constraints.Where(constraint => constraint.FKTableName == tableName).ToDatabaseObjectsCollection(table); tables.Add(table); } }