Browse Source

Data-AddIn/EDMDesigner: Support for composite PKs & FKs (Association resolution buggy)

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4904 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Philipp Maihart 17 years ago
parent
commit
626fbce37f
  1. 32
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Column.cs
  2. 54
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Constraint.cs
  3. 15
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Database.cs
  4. 2
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/ICSharpCode.Data.Core.csproj
  5. 8
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/Interfaces/IColumn.cs
  6. 9
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/Interfaces/IConstraint.cs
  7. 1
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/Interfaces/IDatabase.cs
  8. 2
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/DisplayBinding/EDMDesignerViewContent.cs
  9. 18
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Common/EventedObservableCollection.cs
  10. 7
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/SSDL/Association/Role.cs
  11. 23
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/SSDLIO.cs
  12. 5
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ObjectModelConverters/EDMConverter.cs
  13. 26
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ObjectModelConverters/SSDLConverter.cs
  14. 48
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.SQLServer/SQLServerDatabaseDriver.cs

32
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Column.cs

@ -64,15 +64,16 @@ namespace ICSharpCode.Data.Core.DatabaseObjects @@ -64,15 +64,16 @@ namespace ICSharpCode.Data.Core.DatabaseObjects
else
allowsNull = "not null";
if (_parentTable != null && _parentTable.Constraints != null)
{
IConstraint constraint = _parentTable.Constraints.FirstOrDefault(constr => constr.FKColumnName == Name);
if (constraint != null)
return string.Format("{0} (FK, {1}, {2})", Name, DataType, allowsNull);
}
return string.Format("{0} ({1}, {2})", Name, DataType, allowsNull);
bool isForeignKey = IsForeignKey;
if (IsPrimaryKey && !isForeignKey)
return string.Format("{0} (PK, {1}, {2})", Name, DataType, allowsNull);
else if (!IsPrimaryKey && isForeignKey)
return string.Format("{0} (FK, {1}, {2})", Name, DataType, allowsNull);
else if (IsPrimaryKey && isForeignKey)
return string.Format("{0} (PK, FK, {1}, {2})", Name, DataType, allowsNull);
else
return string.Format("{0} ({1}, {2})", Name, DataType, allowsNull);
}
}
@ -190,7 +191,7 @@ namespace ICSharpCode.Data.Core.DatabaseObjects @@ -190,7 +191,7 @@ namespace ICSharpCode.Data.Core.DatabaseObjects
{
get
{
IConstraint constraint = _parentTable.Constraints.FirstOrDefault(constr => constr.FKColumnName == Name);
IConstraint constraint = _parentTable.Constraints.FirstOrDefault(constr => constr.FKColumns.FirstOrDefault(column => column.ColumnId == ColumnId && column.Name == Name) != null);
if (constraint == null)
return false;
@ -269,6 +270,17 @@ namespace ICSharpCode.Data.Core.DatabaseObjects @@ -269,6 +270,17 @@ namespace ICSharpCode.Data.Core.DatabaseObjects
}
}
public bool IsUserDefinedDataType
{
get
{
if (string.IsNullOrEmpty(_systemType))
return false;
else
return true;
}
}
public bool IsXmlIndexable
{
get { return _isXmlIndexable; }

54
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Constraint.cs

@ -15,22 +15,22 @@ namespace ICSharpCode.Data.Core.DatabaseObjects @@ -15,22 +15,22 @@ namespace ICSharpCode.Data.Core.DatabaseObjects
{
#region Fields
private string _pkColumnName = string.Empty;
private List<string> _pkColumnNames = new List<string>();
private string _pkTableName = string.Empty;
private string _fkColumnName = string.Empty;
private List<string> _fkColumnNames = new List<string>();
private string _fkTableName = string.Empty;
#endregion
#region Properties
public string PKColumnName
public List<string> PKColumnNames
{
get { return _pkColumnName; }
get { return _pkColumnNames; }
set
{
_pkColumnName = value;
OnPropertyChanged("PKColumnName");
_pkColumnNames = value;
OnPropertyChanged("PKColumnNames");
}
}
@ -44,13 +44,13 @@ namespace ICSharpCode.Data.Core.DatabaseObjects @@ -44,13 +44,13 @@ namespace ICSharpCode.Data.Core.DatabaseObjects
}
}
public string FKColumnName
public List<string> FKColumnNames
{
get { return _fkColumnName; }
get { return _fkColumnNames; }
set
{
_fkColumnName = value;
OnPropertyChanged("FKColumnName");
_fkColumnNames = value;
OnPropertyChanged("FKColumnNames");
}
}
@ -64,14 +64,14 @@ namespace ICSharpCode.Data.Core.DatabaseObjects @@ -64,14 +64,14 @@ namespace ICSharpCode.Data.Core.DatabaseObjects
}
}
public IColumn PKColumn
public DatabaseObjectsCollection<IColumn> PKColumns
{
get
{
ITable table = PKTable;
if (table != null)
return GetColumnFromTableByName(table, PKColumnName);
return GetColumnsFromTableByName(table, PKColumnNames);
else
return null;
}
@ -86,25 +86,27 @@ namespace ICSharpCode.Data.Core.DatabaseObjects @@ -86,25 +86,27 @@ namespace ICSharpCode.Data.Core.DatabaseObjects
{
get
{
if (!FKColumn.IsPrimaryKey && FKColumn.IsNullable)
IColumn fkColumn = FKColumns.First();
if (!fkColumn.IsPrimaryKey && fkColumn.IsNullable)
return Cardinality.ZeroToOne;
else if (!FKColumn.IsPrimaryKey && !FKColumn.IsNullable)
else if (!fkColumn.IsPrimaryKey && !fkColumn.IsNullable)
return Cardinality.One;
else if (!FKColumn.IsPrimaryKey)
else if (!fkColumn.IsPrimaryKey)
return Cardinality.Many;
else
return Cardinality.One;
}
}
public IColumn FKColumn
public DatabaseObjectsCollection<IColumn> FKColumns
{
get
{
ITable table = FKTable;
if (table != null)
return GetColumnFromTableByName(table, FKColumnName);
return GetColumnsFromTableByName(table, FKColumnNames);
else
return null;
}
@ -119,12 +121,16 @@ namespace ICSharpCode.Data.Core.DatabaseObjects @@ -119,12 +121,16 @@ namespace ICSharpCode.Data.Core.DatabaseObjects
{
get
{
if (PKColumn.IsPrimaryKey)
return Cardinality.Many;
else if (!PKColumn.IsPrimaryKey && !FKColumn.IsNullable)
IColumn pkColumn = PKColumns.First();
if (!pkColumn.IsPrimaryKey && !FKColumns.First().IsNullable)
return Cardinality.One;
else // !PKColumn.IsPrimaryKey && FKColumn.IsNullable
return Cardinality.ZeroToOne;
if (pkColumn.IsPrimaryKey && pkColumn.IsForeignKey)
return Cardinality.One;
if (pkColumn.IsPrimaryKey)
return Cardinality.Many;
return Cardinality.ZeroToOne;
}
}
@ -149,9 +155,9 @@ namespace ICSharpCode.Data.Core.DatabaseObjects @@ -149,9 +155,9 @@ namespace ICSharpCode.Data.Core.DatabaseObjects
return null;
}
private IColumn GetColumnFromTableByName(ITable table, string columnName)
private DatabaseObjectsCollection<IColumn> GetColumnsFromTableByName(ITable table, List<string> columnNames)
{
return table.Items.FirstOrDefault(c => c.Name == columnName);
return table.Items.Where(c => columnNames.Contains(c.Name)).ToDatabaseObjectsCollection();
}
#endregion

15
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Database.cs

@ -23,7 +23,6 @@ namespace ICSharpCode.Data.Core.DatabaseObjects @@ -23,7 +23,6 @@ namespace ICSharpCode.Data.Core.DatabaseObjects
private DatabaseObjectBase<IView> _views = null;
private DatabaseObjectBase<IProcedure> _procedures = null;
private DatabaseObjectBase<IConstraint> _constraints = null;
private DatabaseObjectBase<IUserDefinedDataType> _userDefinedDataTypes = null;
#endregion
@ -83,17 +82,6 @@ namespace ICSharpCode.Data.Core.DatabaseObjects @@ -83,17 +82,6 @@ namespace ICSharpCode.Data.Core.DatabaseObjects
}
}
public DatabaseObjectsCollection<IUserDefinedDataType> UserDefinedDataTypes
{
get
{
if (_userDefinedDataTypes != null)
return _userDefinedDataTypes.Items;
else
return null;
}
}
#endregion
#region Constructor
@ -114,9 +102,6 @@ namespace ICSharpCode.Data.Core.DatabaseObjects @@ -114,9 +102,6 @@ namespace ICSharpCode.Data.Core.DatabaseObjects
_constraints = new DatabaseObjectBase<IConstraint>();
_constraints.Name = "Constraints";
_userDefinedDataTypes = new DatabaseObjectBase<IUserDefinedDataType>();
_userDefinedDataTypes.Name = "UserDefinedDataTypes";
_tables = new DatabaseObjectBase<ITable>();
_tables.Name = "Tables";
_tables.Items = Datasource.DatabaseDriver.LoadTables(this);

2
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/ICSharpCode.Data.Core.csproj

@ -83,7 +83,6 @@ @@ -83,7 +83,6 @@
<Compile Include="Common\Enumerable.cs" />
<Compile Include="Common\Helper.cs" />
<Compile Include="DatabaseObjects\TableType.cs" />
<Compile Include="DatabaseObjects\UserDefinedDataType.cs" />
<Compile Include="DatabaseObjects\View.cs" />
<Compile Include="Enums\Cardinality.cs" />
<Compile Include="Enums\ParameterMode.cs" />
@ -98,7 +97,6 @@ @@ -98,7 +97,6 @@
<Compile Include="Interfaces\IProcedure.cs" />
<Compile Include="Interfaces\IProcedureParameter.cs" />
<Compile Include="Interfaces\ITable.cs" />
<Compile Include="Interfaces\IUserDefinedDataType.cs" />
<Compile Include="Interfaces\IView.cs" />
<Compile Include="Common\Objects.cs" />
<Compile Include="Properties\AssemblyInfo.cs">

8
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/Interfaces/IColumn.cs

@ -1,8 +1,12 @@ @@ -1,8 +1,12 @@
using System;
#region Usings
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
#endregion
namespace ICSharpCode.Data.Core.Interfaces
{
public interface IColumn : IDatabaseObjectBase
@ -16,6 +20,7 @@ namespace ICSharpCode.Data.Core.Interfaces @@ -16,6 +20,7 @@ namespace ICSharpCode.Data.Core.Interfaces
bool IsComputed { get; set; }
bool IsCursorType { get; set; }
bool IsDeterministic { get; set; }
bool IsForeignKey { get; }
bool IsFulltextIndexed { get; set; }
bool IsIdentity { get; set; }
bool IsIdNotForRepl { get; set; }
@ -25,6 +30,7 @@ namespace ICSharpCode.Data.Core.Interfaces @@ -25,6 +30,7 @@ namespace ICSharpCode.Data.Core.Interfaces
bool IsPrecise { get; set; }
bool IsPrimaryKey { get; set; }
bool IsRowGuidCol { get; set; }
bool IsUserDefinedDataType { get; }
bool IsSystemVerified { get; set; }
bool IsXmlIndexable { get; set; }
int Precision { get; set; }

9
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/Interfaces/IConstraint.cs

@ -5,6 +5,7 @@ using System.Collections.Generic; @@ -5,6 +5,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using ICSharpCode.Data.Core.Enums;
using ICSharpCode.Data.Core.DatabaseObjects;
#endregion
@ -12,13 +13,13 @@ namespace ICSharpCode.Data.Core.Interfaces @@ -12,13 +13,13 @@ namespace ICSharpCode.Data.Core.Interfaces
{
public interface IConstraint : IDatabaseObjectBase
{
string PKColumnName { get; set; }
List<string> PKColumnNames { get; set; }
string PKTableName { get; set; }
string FKColumnName { get; set; }
List<string> FKColumnNames { get; set; }
string FKTableName { get; set; }
IColumn PKColumn { get; }
DatabaseObjectsCollection<IColumn> PKColumns { get; }
ITable PKTable { get; }
IColumn FKColumn { get; }
DatabaseObjectsCollection<IColumn> FKColumns { get; }
ITable FKTable { get; }
Cardinality PKCardinality { get; }
Cardinality FKCardinality { get; }

1
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/Interfaces/IDatabase.cs

@ -19,7 +19,6 @@ namespace ICSharpCode.Data.Core.Interfaces @@ -19,7 +19,6 @@ namespace ICSharpCode.Data.Core.Interfaces
DatabaseObjectsCollection<IView> Views { get; }
DatabaseObjectsCollection<IProcedure> Procedures { get; }
DatabaseObjectsCollection<IConstraint> Constraints { get; }
DatabaseObjectsCollection<IUserDefinedDataType> UserDefinedDataTypes { get; }
bool LoadDatabase();
}

2
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/DisplayBinding/EDMDesignerViewContent.cs

@ -107,6 +107,8 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding @@ -107,6 +107,8 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding
if (wizard.DialogResult == true)
_edmView = new EDMView(wizard.EDMXDocument, readMoreAction);
else
return;
}
// Load or generate DesignerView and EntityTypeDesigners

18
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Common/EventedObservableCollection.cs

@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
using System;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Collections.Generic;
#endregion
@ -52,4 +53,21 @@ namespace ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Common @@ -52,4 +53,21 @@ namespace ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Common
#endregion
}
public static class EventedObservableCollection
{
#region Extension methods
public static EventedObservableCollection<T> ToEventedObservableCollection<T>(this IEnumerable<T> source)
{
EventedObservableCollection<T> dest = new EventedObservableCollection<T>();
foreach (T item in source)
dest.Add(item);
return dest;
}
#endregion
}
}

7
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/SSDL/Association/Role.cs

@ -15,6 +15,11 @@ namespace ICSharpCode.Data.EDMDesigner.Core.EDMObjects.SSDL.Association @@ -15,6 +15,11 @@ namespace ICSharpCode.Data.EDMDesigner.Core.EDMObjects.SSDL.Association
{
public EntityType.EntityType Type { get; set; }
public Cardinality Cardinality { get; set; }
public Property.Property Property { get; set; }
public EventedObservableCollection<Property.Property> Properties { get; set; }
public Role()
{
Properties = new EventedObservableCollection<Property.Property>();
}
}
}

23
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/SSDLIO.cs

@ -123,17 +123,22 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO @@ -123,17 +123,22 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO
new XElement(ssdlNamespace + "End", new XAttribute("Role", association.Role1.Name), new XAttribute("Type", string.Concat(entityContainerNamespace, association.Role1.Type.Name)), new XAttribute("Multiplicity", CardinalityStringConverter.CardinalityToSTring(association.Role1.Cardinality))),
new XElement(ssdlNamespace + "End", new XAttribute("Role", role2Name), new XAttribute("Type", string.Concat(entityContainerNamespace, association.Role2.Type.Name)), new XAttribute("Multiplicity", CardinalityStringConverter.CardinalityToSTring(association.Role2.Cardinality))));
string dependantRoleName = association.DependantRole.Name;
string dependentRoleName = association.DependantRole.Name;
// If the assocation end properties are the same properties
if (association.PrincipalRole.Name == association.DependantRole.Name && association.PrincipalRole.Type.Name == association.DependantRole.Type.Name)
dependantRoleName += "1";
dependentRoleName += "1";
associationElement.Add(new XElement(ssdlNamespace + "ReferentialConstraint",
new XElement(ssdlNamespace + "Principal", new XAttribute("Role", association.PrincipalRole.Name),
new XElement(ssdlNamespace + "PropertyRef", new XAttribute("Name", association.PrincipalRole.Property.Name))),
new XElement(ssdlNamespace + "Dependent", new XAttribute("Role", dependantRoleName),
new XElement(ssdlNamespace + "PropertyRef", new XAttribute("Name", association.DependantRole.Property.Name)))));
XElement principalRoleElement = new XElement(ssdlNamespace + "Principal", new XAttribute("Role", association.PrincipalRole.Name));
foreach (Property property in association.PrincipalRole.Properties)
principalRoleElement.Add(new XElement(ssdlNamespace + "PropertyRef", new XAttribute("Name", property.Name)));
XElement dependentRoleElement = new XElement(ssdlNamespace + "Dependent", new XAttribute("Role", dependentRoleName));
foreach (Property property in association.DependantRole.Properties)
dependentRoleElement.Add(new XElement(ssdlNamespace + "PropertyRef", new XAttribute("Name", property.Name)));
XElement referentialConstraintElement = new XElement(ssdlNamespace + "ReferentialConstraint", principalRoleElement, dependentRoleElement);
associationElement.Add(referentialConstraintElement);
schema.Add(associationElement);
}
@ -250,13 +255,13 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO @@ -250,13 +255,13 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO
{
isPrincipal = true;
association.PrincipalRole = role;
role.Property = role.Type.Properties.Where(p => p.Name == principalElement.Element(XName.Get("PropertyRef", ssdlNamespace.NamespaceName)).Attribute("Name").Value).First();
role.Properties = role.Type.Properties.Where(p => p.Name == principalElement.Element(XName.Get("PropertyRef", ssdlNamespace.NamespaceName)).Attribute("Name").Value).ToEventedObservableCollection();
}
else
{
isPrincipal = false;
association.DependantRole = role;
role.Property = role.Type.Properties.Where(p => p.Name == referentialConstraintElement.Element(XName.Get("Dependent", ssdlNamespace.NamespaceName)).Element(XName.Get("PropertyRef", ssdlNamespace.NamespaceName)).Attribute("Name").Value).First();
role.Properties = role.Type.Properties.Where(p => p.Name == referentialConstraintElement.Element(XName.Get("Dependent", ssdlNamespace.NamespaceName)).Element(XName.Get("PropertyRef", ssdlNamespace.NamespaceName)).Attribute("Name").Value).ToEventedObservableCollection();
}
}
if (isPrincipal)

5
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ObjectModelConverters/EDMConverter.cs

@ -56,15 +56,16 @@ namespace ICSharpCode.Data.EDMDesigner.Core.ObjectModelConverters @@ -56,15 +56,16 @@ namespace ICSharpCode.Data.EDMDesigner.Core.ObjectModelConverters
filenameRump, objectContextName, objectContextNamespace);
processStartInfo.UseShellExecute = false;
processStartInfo.ErrorDialog = false;
processStartInfo.RedirectStandardOutput = true;
processStartInfo.RedirectStandardError = true;
process.StartInfo = processStartInfo;
process.Start();
string outputMessage = process.StandardOutput.ReadToEnd();
process.WaitForExit();
if (process.ExitCode != 0)
{
TextReader textReader = process.StandardError;
throw new Exception("An error occured during generating the EDMX file.", new Exception(textReader.ReadToEnd()));
throw new Exception("An error occured during generating the EDMX file.", new Exception(outputMessage));
}
XDocument csdlXDocument = XDocument.Load(filenameRump + ".csdl");

26
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ObjectModelConverters/SSDLConverter.cs

@ -127,15 +127,19 @@ namespace ICSharpCode.Data.EDMDesigner.Core.ObjectModelConverters @@ -127,15 +127,19 @@ namespace ICSharpCode.Data.EDMDesigner.Core.ObjectModelConverters
Property property = new Property(entityType)
{
Name = column.Name,
Type = column.DataType,
IsKey = column.IsPrimaryKey,
Nullable = column.IsNullable,
Nullable = column.IsNullable
// FixedLength
// Collation
// DefaultValue
// Unicode
};
if (!column.IsUserDefinedDataType)
property.Type = column.DataType;
else
property.Type = column.SystemType;
if (column.Length > 0)
property.MaxLength = column.Length;
@ -167,9 +171,12 @@ namespace ICSharpCode.Data.EDMDesigner.Core.ObjectModelConverters @@ -167,9 +171,12 @@ namespace ICSharpCode.Data.EDMDesigner.Core.ObjectModelConverters
Cardinality = (Cardinality)constraint.PKCardinality
};
Property role1Property = CreateSSDLProperty(constraint.PKColumn, CreateSSDLEntityType(constraint.PKTable));
role1.Property = role1Property;
role1.Type = role1Property.EntityType;
foreach (IColumn pkColumn in constraint.PKColumns)
{
Property role1Property = CreateSSDLProperty(pkColumn, CreateSSDLEntityType(constraint.PKTable));
role1.Properties.Add(role1Property);
role1.Type = role1Property.EntityType;
}
association.Role1 = role1;
association.PrincipalRole = role1;
@ -180,9 +187,12 @@ namespace ICSharpCode.Data.EDMDesigner.Core.ObjectModelConverters @@ -180,9 +187,12 @@ namespace ICSharpCode.Data.EDMDesigner.Core.ObjectModelConverters
Cardinality = (Cardinality)constraint.FKCardinality
};
Property role2Property = CreateSSDLProperty(constraint.FKColumn, CreateSSDLEntityType(constraint.FKTable));
role2.Property = role2Property;
role2.Type = role2Property.EntityType;
foreach (IColumn fkColumn in constraint.FKColumns)
{
Property role2Property = CreateSSDLProperty(fkColumn, CreateSSDLEntityType(constraint.FKTable));
role2.Properties.Add(role2Property);
role2.Type = role2Property.EntityType;
}
association.Role2 = role2;
association.DependantRole = role2;

48
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.SQLServer/SQLServerDatabaseDriver.cs

@ -107,7 +107,6 @@ namespace ICSharpCode.Data.Core.DatabaseDrivers.SQLServer @@ -107,7 +107,6 @@ 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}'";
@ -228,6 +227,7 @@ namespace ICSharpCode.Data.Core.DatabaseDrivers.SQLServer @@ -228,6 +227,7 @@ namespace ICSharpCode.Data.Core.DatabaseDrivers.SQLServer
column.ColumnId = (int)dtColumns.Rows[j]["ColumnId"];
column.Name = (string)dtColumns.Rows[j]["Name"];
column.DataType = (string)dtColumns.Rows[j]["DataType"];
column.SystemType = (string)dtColumns.Rows[j]["SystemType"];
column.Length = Convert.ToInt32(dtColumns.Rows[j]["Length"]);
if (column.Length == -1)
@ -241,6 +241,16 @@ namespace ICSharpCode.Data.Core.DatabaseDrivers.SQLServer @@ -241,6 +241,16 @@ namespace ICSharpCode.Data.Core.DatabaseDrivers.SQLServer
default:
break;
}
switch (column.SystemType.ToLower())
{
case "varchar":
case "nvarchar":
column.SystemType += "(max)";
break;
default:
break;
}
}
column.Precision = Convert.ToInt32(dtColumns.Rows[j]["NumericPrecision"]);
@ -267,33 +277,23 @@ namespace ICSharpCode.Data.Core.DatabaseDrivers.SQLServer @@ -267,33 +277,23 @@ namespace ICSharpCode.Data.Core.DatabaseDrivers.SQLServer
for (int i = 0; i < dtConstraints.Rows.Count; i++)
{
IConstraint constraint = new ICSharpCode.Data.Core.DatabaseObjects.Constraint();
constraint.Name = (string)dtConstraints.Rows[i]["ConstraintName"];
constraint.FKTableName = (string)dtConstraints.Rows[i]["FKTable"];
constraint.FKColumnName = (string)dtConstraints.Rows[i]["FKColumn"];
constraint.PKTableName = (string)dtConstraints.Rows[i]["PKTable"];
constraint.PKColumnName = (string)dtConstraints.Rows[i]["PKColumn"];
database.Constraints.Add(constraint);
}
}
string constraintName = (string)dtConstraints.Rows[i]["ConstraintName"];
using (SqlDataAdapter da = new SqlDataAdapter(_getUserDefinedDataTypes, sqlConnection))
{
DataTable dtUserDefinedDataTypes = new DataTable("UserDefinedDataTypes");
da.Fill(dtUserDefinedDataTypes);
IConstraint constraint = database.Constraints.FirstOrDefault(c => c.Name == constraintName);
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"];
if (constraint == null)
{
constraint = new ICSharpCode.Data.Core.DatabaseObjects.Constraint();
constraint.Name = constraintName;
constraint.FKTableName = (string)dtConstraints.Rows[i]["FKTable"];
constraint.PKTableName = (string)dtConstraints.Rows[i]["PKTable"];
database.UserDefinedDataTypes.Add(userDefinedDataType);
}
database.Constraints.Add(constraint);
}
constraint.FKColumnNames.Add((string)dtConstraints.Rows[i]["FKColumn"]);
constraint.PKColumnNames.Add((string)dtConstraints.Rows[i]["PKColumn"]);
}
}
using (SqlDataAdapter da = new SqlDataAdapter(_getTables, sqlConnection))

Loading…
Cancel
Save