private static List<KeySchema> GetKeys(DbConnection con, SchemaNamedElement eTable) { var aStore = new List<KeySchema>(); var aHash = new List<string>(); string[] restrict3 = {null, null, null}; #region Primary restrict3[0] = null; restrict3[1] = null; restrict3[2] = eTable.Name; var dtShema = con.GetSchema("PrimaryKeys", restrict3); aHash.Clear(); for (var x = 0; x < dtShema.Rows.Count; x++) { var cRow = dtShema.Rows[x]; var cName = cRow["PK_NAME"].ToString(); if (aHash.Contains(cName)) continue; var eKey = new KeySchema(); var columns = ""; aHash.Add(cName); eKey.KeyType = ConstraintType.KeyPrimary; eKey.Name = cName; var dtv = dtShema.DefaultView; dtv.RowFilter = "PK_NAME = '" + cName + "'"; dtv.Sort = "ORDINAL_POSITION ASC"; for (var y = 0; y < dtv.Count; y++) columns += (dtv[y]["COLUMN_NAME"] + ", "); columns = columns.Remove(columns.Length - 2, 2); eKey.Columns = columns; aStore.Add(eKey); } #endregion #region Foreign restrict3[0] = null; restrict3[1] = null; restrict3[2] = eTable.Name; dtShema = con.GetSchema("ForeignKeys", restrict3); var dtShemaCols = con.GetSchema("ForeignKeyColumns", restrict3); for (var x = 0; x < dtShema.Rows.Count; x++) { var cRow = dtShema.Rows[x]; var cName = cRow["INDEX_NAME"].ToString(); var eKey = new KeySchema(); string columns = "", rcolumns = ""; eKey.KeyType = ConstraintType.KeyForeign; eKey.Name = cName; eKey.RelTable = cRow["REFERENCED_TABLE_NAME"].ToString(); var uRule = cRow["UPDATE_RULE"].ToString(); var dRule = cRow["DELETE_RULE"].ToString(); switch (uRule) { case "RESTRICT": eKey.UpdateRule = LinkRule.None; break; case "CASCADE": eKey.UpdateRule = LinkRule.Cascade; break; case "SET NULL": eKey.UpdateRule = LinkRule.SetNull; break; case "SET DEFAULT": eKey.UpdateRule = LinkRule.SetDefault; break; } switch (dRule) { case "RESTRICT": eKey.DeleteRule = LinkRule.None; break; case "CASCADE": eKey.DeleteRule = LinkRule.Cascade; break; case "SET NULL": eKey.DeleteRule = LinkRule.SetNull; break; case "SET DEFAULT": eKey.DeleteRule = LinkRule.SetDefault; break; } var dtv = dtShemaCols.DefaultView; dtv.RowFilter = "CONSTRAINT_NAME = '" + cName + "'"; dtv.Sort = "ORDINAL_POSITION ASC"; for (var y = 0; y < dtv.Count; y++) { columns += (dtv[y]["COLUMN_NAME"] + ", "); rcolumns += (dtv[y]["REFERENCED_COLUMN_NAME"] + ", "); } columns = columns.Remove(columns.Length - 2, 2); rcolumns = rcolumns.Remove(rcolumns.Length - 2, 2); eKey.Columns = columns; eKey.RelColumns = rcolumns; aStore.Add(eKey); } #endregion #region Unique restrict3[0] = null; restrict3[1] = null; restrict3[2] = eTable.Name; dtShema = con.GetSchema("UniqueKeys", restrict3); aHash.Clear(); for (var x = 0; x < dtShema.Rows.Count; x++) { var cRow = dtShema.Rows[x]; var cName = cRow["UK_NAME"].ToString(); if (aHash.Contains(cName)) continue; var eKey = new KeySchema(); var columns = ""; aHash.Add(cName); eKey.KeyType = ConstraintType.Unique; eKey.Name = cName; var dtv = dtShema.DefaultView; dtv.RowFilter = "UK_NAME = '" + cName + "'"; dtv.Sort = "ORDINAL_POSITION ASC"; for (var y = 0; y < dtv.Count; y++) columns += (dtv[y]["COLUMN_NAME"] + ", "); columns = columns.Remove(columns.Length - 2, 2); eKey.Columns = columns; aStore.Add(eKey); } #endregion return aStore; }
private string MakeDdlGeneratorDrop(SchemaNamedElement gen) { return(string.Format(@"DROP GENERATOR {0}", MakeDdlElementName(gen.Name))); }
private static List <KeySchema> GetKeys(SqlConnection con, SchemaNamedElement eTable) { var keys = new List <KeySchema>(); var aHash = new Dictionary <string, bool>(); string[] restrict3 = { null, null, null }; string[] restrict4 = { null, null, null, null }; #region Primary keys restrict3[0] = null; restrict3[1] = null; restrict3[2] = eTable.Name; var dtShema = SqlSchemaFactory.GetSchema(con, "PrimaryKeys", restrict3); aHash.Clear(); for (var x = 0; x < dtShema.Rows.Count; x++) { var cRow = dtShema.Rows[x]; var cName = cRow["CONSTRAINT_NAME"].ToString(); if (aHash.ContainsKey(cName)) { continue; } aHash.Add(cName, true); var eKey = new KeySchema { KeyType = ConstraintType.KeyPrimary, Name = cName, Clustered = Convert.ToBoolean(cRow["IS_CLUSTERED"], CultureInfo.InvariantCulture) }; var columns = new StringBuilder(); var dtv = dtShema.DefaultView; dtv.RowFilter = string.Format("CONSTRAINT_NAME = '{0}'", cName); dtv.Sort = "ORDINAL_POSITION ASC"; for (var y = 0; y < dtv.Count; y++) { columns.Append(dtv[y]["COLUMN_NAME"]); columns.Append(y == dtv.Count - 1 ? string.Empty : ", "); } eKey.Columns = columns.ToString(); keys.Add(eKey); } #endregion #region Foreign keys restrict4[0] = null; restrict4[1] = null; restrict4[2] = eTable.Name; restrict4[3] = null; dtShema = SqlSchemaFactory.GetSchema(con, "ForeignKeys", restrict4); aHash.Clear(); for (var x = 0; x < dtShema.Rows.Count; x++) { var cRow = dtShema.Rows[x]; if (Convert.ToBoolean(cRow["IS_DISABLED"], CultureInfo.InvariantCulture)) { continue; } var cName = cRow["CONSTRAINT_NAME"].ToString(); if (aHash.ContainsKey(cName)) { continue; } aHash.Add(cName, true); var eKey = new KeySchema { KeyType = ConstraintType.KeyForeign, Name = cName, RelTable = cRow["PK_TABLE_NAME"].ToString(), UpdateRule = GetDbsmRule(cRow["UPDATE_RULE"].ToString()), DeleteRule = GetDbsmRule(cRow["DELETE_RULE"].ToString()) }; var fcolumns = new StringBuilder(); var rcolumns = new StringBuilder(); var dtv = dtShema.DefaultView; dtv.RowFilter = string.Format("CONSTRAINT_NAME = '{0}'", cName); dtv.Sort = "ORDINAL_POSITION ASC"; for (var y = 0; y < dtv.Count; y++) { fcolumns.Append(dtv[y]["FK_COLUMN_NAME"]); fcolumns.Append(y == dtv.Count - 1 ? string.Empty : ", "); rcolumns.Append(dtv[y]["PK_COLUMN_NAME"]); rcolumns.Append(y == dtv.Count - 1 ? string.Empty : ", "); } eKey.Columns = fcolumns.ToString(); eKey.RelColumns = rcolumns.ToString(); keys.Add(eKey); } #endregion #region Checks restrict3[0] = null; restrict3[1] = null; restrict3[2] = eTable.Name; dtShema = SqlSchemaFactory.GetSchema(con, "CheckConstraints", restrict3); for (var x = 0; x < dtShema.Rows.Count; x++) { var row = dtShema.Rows[x]; var eKey = new KeySchema { KeyType = ConstraintType.Check, Name = row["CONSTRAINT_NAME"].ToString(), Source = row["SOURCE"].ToString() }; keys.Add(eKey); } #endregion #region Unique restrict3[0] = null; restrict3[1] = null; restrict3[2] = eTable.Name; dtShema = SqlSchemaFactory.GetSchema(con, "UniqueKeys", restrict3); aHash.Clear(); for (var x = 0; x < dtShema.Rows.Count; x++) { var cRow = dtShema.Rows[x]; var cName = cRow["CONSTRAINT_NAME"].ToString(); if (aHash.ContainsKey(cName)) { continue; } var eKey = new KeySchema(); aHash.Add(cName, true); eKey.KeyType = ConstraintType.Unique; eKey.Name = cName; var columns = new StringBuilder(); var dtv = dtShema.DefaultView; dtv.RowFilter = "CONSTRAINT_NAME = '" + cName + "'"; dtv.Sort = "ORDINAL_POSITION ASC"; for (var y = 0; y < dtv.Count; y++) { columns.Append(dtv[y]["COLUMN_NAME"]); columns.Append(y == dtv.Count - 1 ? string.Empty : ", "); } eKey.Columns = columns.ToString(); keys.Add(eKey); } #endregion #region Default constraints restrict3[0] = null; restrict3[1] = null; restrict3[2] = eTable.Name; dtShema = SqlSchemaFactory.GetSchema(con, "DefaultConstraints", restrict3); for (var x = 0; x < dtShema.Rows.Count; x++) { var cRow = dtShema.Rows[x]; var eKey = new KeySchema { KeyType = ConstraintType.Default, Name = cRow["CONSTRAINT_NAME"].ToString(), Columns = cRow["COLUMN_NAME"].ToString(), Source = UnBracket.ParseUnBracket(cRow["SOURCE"].ToString()) }; keys.Add(eKey); } #endregion return(keys); }
private string MakeDdlGeneratorDrop(SchemaNamedElement gen) { return string.Format(@"DROP GENERATOR {0}", MakeDdlElementName(gen.Name)); }
private string MakeDdlGeneratorCreate(SchemaNamedElement gen) { return(string.Format(@"CREATE GENERATOR {0}", MakeDdlElementName(gen.Name))); }
private static List <KeySchema> GetKeys(DbConnection con, SchemaNamedElement eTable) { var aStore = new List <KeySchema>(); var aHash = new List <string>(); string[] restrict3 = { null, null, null }; #region Primary restrict3[0] = null; restrict3[1] = null; restrict3[2] = eTable.Name; var dtShema = con.GetSchema("PrimaryKeys", restrict3); aHash.Clear(); for (var x = 0; x < dtShema.Rows.Count; x++) { var cRow = dtShema.Rows[x]; var cName = cRow["PK_NAME"].ToString(); if (aHash.Contains(cName)) { continue; } var eKey = new KeySchema(); var columns = ""; aHash.Add(cName); eKey.KeyType = ConstraintType.KeyPrimary; eKey.Name = cName; var dtv = dtShema.DefaultView; dtv.RowFilter = "PK_NAME = '" + cName + "'"; dtv.Sort = "ORDINAL_POSITION ASC"; for (var y = 0; y < dtv.Count; y++) { columns += (dtv[y]["COLUMN_NAME"] + ", "); } columns = columns.Remove(columns.Length - 2, 2); eKey.Columns = columns; aStore.Add(eKey); } #endregion #region Foreign restrict3[0] = null; restrict3[1] = null; restrict3[2] = eTable.Name; dtShema = con.GetSchema("ForeignKeys", restrict3); var dtShemaCols = con.GetSchema("ForeignKeyColumns", restrict3); for (var x = 0; x < dtShema.Rows.Count; x++) { var cRow = dtShema.Rows[x]; var cName = cRow["INDEX_NAME"].ToString(); var eKey = new KeySchema(); string columns = "", rcolumns = ""; eKey.KeyType = ConstraintType.KeyForeign; eKey.Name = cName; eKey.RelTable = cRow["REFERENCED_TABLE_NAME"].ToString(); var uRule = cRow["UPDATE_RULE"].ToString(); var dRule = cRow["DELETE_RULE"].ToString(); switch (uRule) { case "RESTRICT": eKey.UpdateRule = LinkRule.None; break; case "CASCADE": eKey.UpdateRule = LinkRule.Cascade; break; case "SET NULL": eKey.UpdateRule = LinkRule.SetNull; break; case "SET DEFAULT": eKey.UpdateRule = LinkRule.SetDefault; break; } switch (dRule) { case "RESTRICT": eKey.DeleteRule = LinkRule.None; break; case "CASCADE": eKey.DeleteRule = LinkRule.Cascade; break; case "SET NULL": eKey.DeleteRule = LinkRule.SetNull; break; case "SET DEFAULT": eKey.DeleteRule = LinkRule.SetDefault; break; } var dtv = dtShemaCols.DefaultView; dtv.RowFilter = "CONSTRAINT_NAME = '" + cName + "'"; dtv.Sort = "ORDINAL_POSITION ASC"; for (var y = 0; y < dtv.Count; y++) { columns += (dtv[y]["COLUMN_NAME"] + ", "); rcolumns += (dtv[y]["REFERENCED_COLUMN_NAME"] + ", "); } columns = columns.Remove(columns.Length - 2, 2); rcolumns = rcolumns.Remove(rcolumns.Length - 2, 2); eKey.Columns = columns; eKey.RelColumns = rcolumns; aStore.Add(eKey); } #endregion #region Unique restrict3[0] = null; restrict3[1] = null; restrict3[2] = eTable.Name; dtShema = con.GetSchema("UniqueKeys", restrict3); aHash.Clear(); for (var x = 0; x < dtShema.Rows.Count; x++) { var cRow = dtShema.Rows[x]; var cName = cRow["UK_NAME"].ToString(); if (aHash.Contains(cName)) { continue; } var eKey = new KeySchema(); var columns = ""; aHash.Add(cName); eKey.KeyType = ConstraintType.Unique; eKey.Name = cName; var dtv = dtShema.DefaultView; dtv.RowFilter = "UK_NAME = '" + cName + "'"; dtv.Sort = "ORDINAL_POSITION ASC"; for (var y = 0; y < dtv.Count; y++) { columns += (dtv[y]["COLUMN_NAME"] + ", "); } columns = columns.Remove(columns.Length - 2, 2); eKey.Columns = columns; aStore.Add(eKey); } #endregion return(aStore); }
private string MakeDdlGeneratorCreate(SchemaNamedElement gen) { return string.Format(@"CREATE GENERATOR {0}", MakeDdlElementName(gen.Name)); }
private static List <KeySchema> GetKeys(DbConnection con, SchemaNamedElement eTable) { var dbsmKeys = new Dictionary <string, KeySchema>(); string[] restrict3 = { null, null, eTable.Name }; #region Primary var dtShema = con.GetSchema("Columns", restrict3); var dtv = dtShema.DefaultView; dtv.RowFilter = "PRIMARY_KEY = 'True'"; dtv.Sort = "ORDINAL_POSITION ASC"; if (dtv.Count > 0) { string columns = null; for (var y = 0; y < dtv.Count; y++) { if (columns == null) { columns = dtv[y]["COLUMN_NAME"].ToString(); } else { columns += (", " + dtv[y]["COLUMN_NAME"]); } } var eKey = new KeySchema { KeyType = ConstraintType.KeyPrimary, Name = ("PK_" + eTable.Name), Columns = columns }; dbsmKeys.Add(eKey.Name, eKey); } #endregion #region Unique (не поддерживается SQLite) //dtv.RowFilter = "PRIMARY_KEY = 'False' AND UNIQUE = 'True'"; //dtv.Sort = "ORDINAL_POSITION ASC"; // //for (int y = 0; y < dtv.Count; y++) //{ // string cName = dtv[y]["COLUMN_NAME"].ToString(); // if (!dbsmKeys.ContainsKey(cName)) // { // DBKey eKey = new DBKey(); // eKey.Name = cName; // eKey.KeyType = ConstraintType.Unique; // eKey.ColumnList = cName; // dbsmKeys.Add(cName, eKey); // } //} #endregion #region Foreign dtShema = con.GetSchema("ForeignKeys", restrict3); for (var x = 0; x < dtShema.Rows.Count; x++) { var cRow = dtShema.Rows[x]; var cName = cRow["CONSTRAINT_NAME"].ToString(); if (dbsmKeys.ContainsKey(cName)) { continue; } var eKey = new KeySchema(); string columns = null; string rcolumns = null; eKey.KeyType = ConstraintType.KeyForeign; eKey.Name = cName; eKey.RelTable = cRow["TABLE_NAME"].ToString(); dtv = dtShema.DefaultView; dtv.RowFilter = "CONSTRAINT_NAME = '" + cName + "'"; dtv.Sort = "FKEY_FROM_ORDINAL_POSITION ASC"; for (var y = 0; y < dtv.Count; y++) { if (columns == null) { Debug.Assert(rcolumns == null); columns = dtv[y]["FKEY_FROM_COLUMN"].ToString(); rcolumns = dtv[y]["FKEY_TO_COLUMN"].ToString(); } else { Debug.Assert(rcolumns != null); columns += (", " + dtv[y]["FKEY_FROM_COLUMN"]); rcolumns += (", " + dtv[y]["FKEY_TO_COLUMN"]); } } eKey.Columns = columns; eKey.RelColumns = rcolumns; dbsmKeys.Add(cName, eKey); } #endregion return(new List <KeySchema>(dbsmKeys.Values)); }
private string MakeDdlGeneratorDrop(SchemaNamedElement gen) { return $@"DROP GENERATOR {MakeDdlElementName(gen.Name)}"; }
private string MakeDdlGeneratorCreate(SchemaNamedElement gen) { return $@"CREATE GENERATOR {MakeDdlElementName(gen.Name)}"; }
private static List<KeySchema> GetKeys(SqlConnection con, SchemaNamedElement eTable) { var keys = new List<KeySchema>(); var aHash = new Dictionary<string, bool>(); string[] restrict3 = {null, null, null}; string[] restrict4 = {null, null, null, null}; #region Primary keys restrict3[0] = null; restrict3[1] = null; restrict3[2] = eTable.Name; var dtShema = SqlSchemaFactory.GetSchema(con, "PrimaryKeys", restrict3); aHash.Clear(); for (var x = 0; x < dtShema.Rows.Count; x++) { var cRow = dtShema.Rows[x]; var cName = cRow["CONSTRAINT_NAME"].ToString(); if (aHash.ContainsKey(cName)) continue; aHash.Add(cName, true); var eKey = new KeySchema { KeyType = ConstraintType.KeyPrimary, Name = cName, Clustered = Convert.ToBoolean(cRow["IS_CLUSTERED"], CultureInfo.InvariantCulture) }; var columns = new StringBuilder(); var dtv = dtShema.DefaultView; dtv.RowFilter = string.Format("CONSTRAINT_NAME = '{0}'", cName); dtv.Sort = "ORDINAL_POSITION ASC"; for (var y = 0; y < dtv.Count; y++) { columns.Append(dtv[y]["COLUMN_NAME"]); columns.Append(y == dtv.Count - 1 ? string.Empty : ", "); } eKey.Columns = columns.ToString(); keys.Add(eKey); } #endregion #region Foreign keys restrict4[0] = null; restrict4[1] = null; restrict4[2] = eTable.Name; restrict4[3] = null; dtShema = SqlSchemaFactory.GetSchema(con, "ForeignKeys", restrict4); aHash.Clear(); for (var x = 0; x < dtShema.Rows.Count; x++) { var cRow = dtShema.Rows[x]; if (Convert.ToBoolean(cRow["IS_DISABLED"], CultureInfo.InvariantCulture)) continue; var cName = cRow["CONSTRAINT_NAME"].ToString(); if (aHash.ContainsKey(cName)) continue; aHash.Add(cName, true); var eKey = new KeySchema { KeyType = ConstraintType.KeyForeign, Name = cName, RelTable = cRow["PK_TABLE_NAME"].ToString(), UpdateRule = GetDbsmRule(cRow["UPDATE_RULE"].ToString()), DeleteRule = GetDbsmRule(cRow["DELETE_RULE"].ToString()) }; var fcolumns = new StringBuilder(); var rcolumns = new StringBuilder(); var dtv = dtShema.DefaultView; dtv.RowFilter = string.Format("CONSTRAINT_NAME = '{0}'", cName); dtv.Sort = "ORDINAL_POSITION ASC"; for (var y = 0; y < dtv.Count; y++) { fcolumns.Append(dtv[y]["FK_COLUMN_NAME"]); fcolumns.Append(y == dtv.Count - 1 ? string.Empty : ", "); rcolumns.Append(dtv[y]["PK_COLUMN_NAME"]); rcolumns.Append(y == dtv.Count - 1 ? string.Empty : ", "); } eKey.Columns = fcolumns.ToString(); eKey.RelColumns = rcolumns.ToString(); keys.Add(eKey); } #endregion #region Checks restrict3[0] = null; restrict3[1] = null; restrict3[2] = eTable.Name; dtShema = SqlSchemaFactory.GetSchema(con, "CheckConstraints", restrict3); for (var x = 0; x < dtShema.Rows.Count; x++) { var row = dtShema.Rows[x]; var eKey = new KeySchema { KeyType = ConstraintType.Check, Name = row["CONSTRAINT_NAME"].ToString(), Source = row["SOURCE"].ToString() }; keys.Add(eKey); } #endregion #region Unique restrict3[0] = null; restrict3[1] = null; restrict3[2] = eTable.Name; dtShema = SqlSchemaFactory.GetSchema(con, "UniqueKeys", restrict3); aHash.Clear(); for (var x = 0; x < dtShema.Rows.Count; x++) { var cRow = dtShema.Rows[x]; var cName = cRow["CONSTRAINT_NAME"].ToString(); if (aHash.ContainsKey(cName)) continue; var eKey = new KeySchema(); aHash.Add(cName, true); eKey.KeyType = ConstraintType.Unique; eKey.Name = cName; var columns = new StringBuilder(); var dtv = dtShema.DefaultView; dtv.RowFilter = "CONSTRAINT_NAME = '" + cName + "'"; dtv.Sort = "ORDINAL_POSITION ASC"; for (var y = 0; y < dtv.Count; y++) { columns.Append(dtv[y]["COLUMN_NAME"]); columns.Append(y == dtv.Count - 1 ? string.Empty : ", "); } eKey.Columns = columns.ToString(); keys.Add(eKey); } #endregion #region Default constraints restrict3[0] = null; restrict3[1] = null; restrict3[2] = eTable.Name; dtShema = SqlSchemaFactory.GetSchema(con, "DefaultConstraints", restrict3); for (var x = 0; x < dtShema.Rows.Count; x++) { var cRow = dtShema.Rows[x]; var eKey = new KeySchema { KeyType = ConstraintType.Default, Name = cRow["CONSTRAINT_NAME"].ToString(), Columns = cRow["COLUMN_NAME"].ToString(), Source = UnBracket.ParseUnBracket(cRow["SOURCE"].ToString()) }; keys.Add(eKey); } #endregion return keys; }
private static List<KeySchema> GetKeys(DbConnection con, SchemaNamedElement eTable) { var dbsmKeys = new Dictionary<string, KeySchema>(); string[] restrict3 = {null, null, eTable.Name}; #region Primary var dtShema = con.GetSchema("Columns", restrict3); var dtv = dtShema.DefaultView; dtv.RowFilter = "PRIMARY_KEY = 'True'"; dtv.Sort = "ORDINAL_POSITION ASC"; if (dtv.Count > 0) { string columns = null; for (var y = 0; y < dtv.Count; y++) if (columns == null) columns = dtv[y]["COLUMN_NAME"].ToString(); else columns += (", " + dtv[y]["COLUMN_NAME"]); var eKey = new KeySchema { KeyType = ConstraintType.KeyPrimary, Name = ("PK_" + eTable.Name), Columns = columns }; dbsmKeys.Add(eKey.Name, eKey); } #endregion #region Unique (не поддерживается SQLite) //dtv.RowFilter = "PRIMARY_KEY = 'False' AND UNIQUE = 'True'"; //dtv.Sort = "ORDINAL_POSITION ASC"; // //for (int y = 0; y < dtv.Count; y++) //{ // string cName = dtv[y]["COLUMN_NAME"].ToString(); // if (!dbsmKeys.ContainsKey(cName)) // { // DBKey eKey = new DBKey(); // eKey.Name = cName; // eKey.KeyType = ConstraintType.Unique; // eKey.ColumnList = cName; // dbsmKeys.Add(cName, eKey); // } //} #endregion #region Foreign dtShema = con.GetSchema("ForeignKeys", restrict3); for (var x = 0; x < dtShema.Rows.Count; x++) { var cRow = dtShema.Rows[x]; var cName = cRow["CONSTRAINT_NAME"].ToString(); if (dbsmKeys.ContainsKey(cName)) continue; var eKey = new KeySchema(); string columns = null; string rcolumns = null; eKey.KeyType = ConstraintType.KeyForeign; eKey.Name = cName; eKey.RelTable = cRow["TABLE_NAME"].ToString(); dtv = dtShema.DefaultView; dtv.RowFilter = "CONSTRAINT_NAME = '" + cName + "'"; dtv.Sort = "FKEY_FROM_ORDINAL_POSITION ASC"; for (var y = 0; y < dtv.Count; y++) if (columns == null) { Debug.Assert(rcolumns == null); columns = dtv[y]["FKEY_FROM_COLUMN"].ToString(); rcolumns = dtv[y]["FKEY_TO_COLUMN"].ToString(); } else { Debug.Assert(rcolumns != null); columns += (", " + dtv[y]["FKEY_FROM_COLUMN"]); rcolumns += (", " + dtv[y]["FKEY_TO_COLUMN"]); } eKey.Columns = columns; eKey.RelColumns = rcolumns; dbsmKeys.Add(cName, eKey); } #endregion return new List<KeySchema>(dbsmKeys.Values); }