public static List <FieldInfo> GetTableFieldInfos(IDbConnection connection, string schema, string tableName) { var inf = InformationSchema(connection); List <FieldInfo> fieldInfos = new List <FieldInfo>(); List <ForeignKeyInfo> foreignKeys = GetTableSingleFieldForeignKeys(connection, schema, tableName); List <string> primaryFields = GetTablePrimaryFields(connection, schema, tableName); List <string> identityFields = GetTableIdentityFields(connection, schema, tableName); var columns = ((DbConnection)((WrappedConnection)connection).ActualConnection).GetSchema("Columns", new string[] { null, schema, tableName, null }); var order = new Dictionary <string, int>(); var ordinal = "ORDINAL_POSITION"; var columnName = "COLUMN_NAME"; var isNullable = "IS_NULLABLE"; var charMax = "CHARACTER_MAXIMUM_LENGTH"; var numPrec = "NUMERIC_PRECISION"; var numScale = "NUMERIC_SCALE"; var dataType = "DATA_TYPE"; if (!columns.Columns.Contains(ordinal) && columns.Columns.Contains(ordinal.ToLowerInvariant())) { ordinal = ordinal.ToLowerInvariant(); columnName = columnName.ToLowerInvariant(); dataType = dataType.ToLowerInvariant(); isNullable = isNullable.ToLowerInvariant(); charMax = charMax.ToLowerInvariant(); numPrec = numPrec.ToLowerInvariant(); numScale = numScale.ToLowerInvariant(); } if (!columns.Columns.Contains(dataType) && columns.Columns.Contains("COLUMN_DATA_TYPE")) { dataType = "COLUMN_DATA_TYPE"; } if (!columns.Columns.Contains(charMax) && columns.Columns.Contains("COLUMN_SIZE")) { charMax = "COLUMN_SIZE"; } foreach (DataRow row in columns.Rows) { FieldInfo fieldInfo = new FieldInfo(); fieldInfo.FieldName = (string)row[columnName]; order[fieldInfo.FieldName] = Convert.ToInt32(row[ordinal]); fieldInfo.IsPrimaryKey = primaryFields.IndexOf(fieldInfo.FieldName) >= 0; fieldInfo.IsIdentity = identityFields.IndexOf(fieldInfo.FieldName) >= 0; fieldInfo.IsNullable = (row[isNullable] as string == "YES") || (row[isNullable] as Boolean? == true); fieldInfo.DataType = row[dataType] as string; fieldInfo.Size = 0; if (fieldInfo.DataType != SqlInt && fieldInfo.DataType != SqlInteger && fieldInfo.DataType != SqlReal && fieldInfo.DataType != SqlFloat && fieldInfo.DataType != SqlTinyInt && fieldInfo.DataType != SqlSmallInt && fieldInfo.DataType != SqlBigInt && fieldInfo.DataType != SqlInt8 && fieldInfo.DataType != SqlInt4) { var val = row[charMax]; var size = (val == null || val == DBNull.Value) ? (Int64?)null : Convert.ToInt64(val); if (size != null && size > 0 && size <= 1000000000) { fieldInfo.Size = (int)size.Value; } val = row[numPrec]; var prec = (val == null || val == DBNull.Value) ? (Int64?)null : Convert.ToInt64(val); string dataType2; if (prec != null && (SqlTypeNameToFieldType(fieldInfo.DataType, fieldInfo.Size, out dataType2) != "String") && prec >= 0 && prec < 1000000000) { fieldInfo.Size = Convert.ToInt32(prec.Value); } val = row[numScale]; var scale = (val == null || val == DBNull.Value) ? (Int64?)null : Convert.ToInt64(val); if (scale != null && scale >= 0 && scale < 1000000000) { fieldInfo.Scale = Convert.ToInt32(scale.Value); } } fieldInfos.Add(fieldInfo); } fieldInfos.Sort((x, y) => order[x.FieldName].CompareTo(order[y.FieldName])); // şimdi ForeignKey tespiti yap, bunu önceki döngüde yapamayız reader'lar çakışır foreach (FieldInfo fieldInfo in fieldInfos) { ForeignKeyInfo foreignKey = foreignKeys.Find( delegate(ForeignKeyInfo d) { return(d.FKColumn == fieldInfo.FieldName); }); if (foreignKey != null) { fieldInfo.PKSchema = foreignKey.PKSchema; fieldInfo.PKTable = foreignKey.PKTable; fieldInfo.PKColumn = foreignKey.PKColumn; } } return(fieldInfos); }
public static List <ForeignKeyInfo> GetTableSingleFieldForeignKeys(IDbConnection connection, string schema, string tableName) { var inf = InformationSchema(connection); List <ForeignKeyInfo> foreignKeyInfos = new List <ForeignKeyInfo>(); if (connection.GetDialect().ServerType.StartsWith("Sqlite", StringComparison.OrdinalIgnoreCase)) { try { using (var reader = SqlHelper.ExecuteReader(connection, (String.Format("PRAGMA foreign_key_list({0});", tableName)))) { while (reader.Read()) { ForeignKeyInfo foreignKeyInfo = new ForeignKeyInfo(); foreignKeyInfo.FKTable = tableName; foreignKeyInfo.FKColumn = reader.GetString(3); foreignKeyInfo.PKTable = reader.GetString(2); foreignKeyInfo.PKColumn = reader.GetString(4); foreignKeyInfos.Add(foreignKeyInfo); } } } catch (Exception) { } return(foreignKeyInfos); } if (connection.GetDialect().ServerType.StartsWith("Firebird", StringComparison.OrdinalIgnoreCase)) { var query = @" select PK.RDB$RELATION_NAME as PKTABLE_NAME ,ISP.RDB$FIELD_NAME as PKCOLUMN_NAME ,FK.RDB$RELATION_NAME as FKTABLE_NAME ,ISF.RDB$FIELD_NAME as FKCOLUMN_NAME ,(ISP.RDB$FIELD_POSITION + 1) as KEY_SEQ ,RC.RDB$UPDATE_RULE as UPDATE_RULE ,RC.RDB$DELETE_RULE as DELETE_RULE ,PK.RDB$CONSTRAINT_NAME as PK_NAME ,FK.RDB$CONSTRAINT_NAME as FK_NAME from RDB$RELATION_CONSTRAINTS PK ,RDB$RELATION_CONSTRAINTS FK ,RDB$REF_CONSTRAINTS RC ,RDB$INDEX_SEGMENTS ISP ,RDB$INDEX_SEGMENTS ISF WHERE FK.RDB$RELATION_NAME = '{0}' and FK.RDB$CONSTRAINT_NAME = RC.RDB$CONSTRAINT_NAME and PK.RDB$CONSTRAINT_NAME = RC.RDB$CONST_NAME_UQ and ISP.RDB$INDEX_NAME = PK.RDB$INDEX_NAME and ISF.RDB$INDEX_NAME = FK.RDB$INDEX_NAME and ISP.RDB$FIELD_POSITION = ISF.RDB$FIELD_POSITION order by 1, 5"; try { using (var reader = SqlHelper.ExecuteReader(connection, (String.Format(query, tableName)))) { while (reader.Read()) { ForeignKeyInfo foreignKeyInfo = new ForeignKeyInfo(); foreignKeyInfo.FKTable = tableName; foreignKeyInfo.FKColumn = reader.GetString(3).TrimEnd(); foreignKeyInfo.PKTable = reader.GetString(0).TrimEnd(); foreignKeyInfo.PKColumn = reader.GetString(1).TrimEnd(); foreignKeyInfos.Add(foreignKeyInfo); } } } catch (Exception) { } return(foreignKeyInfos); } if (connection.GetDialect().ServerType.StartsWith("Postgres", StringComparison.OrdinalIgnoreCase)) { try { var list = connection.Query( @"SELECT * FROM ( SELECT o.conname AS constraint_name, (SELECT nspname FROM pg_namespace WHERE oid=m.relnamespace) AS source_schema, m.relname AS source_table, (SELECT a.attname FROM pg_attribute a WHERE a.attrelid = m.oid AND a.attnum = o.conkey[1] AND a.attisdropped = false) AS source_column, (SELECT nspname FROM pg_namespace WHERE oid=f.relnamespace) AS target_schema, f.relname AS target_table, (SELECT a.attname FROM pg_attribute a WHERE a.attrelid = f.oid AND a.attnum = o.confkey[1] AND a.attisdropped = false) AS target_column FROM pg_constraint o LEFT JOIN pg_class c ON c.oid = o.conrelid LEFT JOIN pg_class f ON f.oid = o.confrelid LEFT JOIN pg_class m ON m.oid = o.conrelid WHERE o.contype = 'f' AND o.conrelid IN (SELECT oid FROM pg_class c WHERE c.relkind = 'r')) x WHERE source_schema = @sh AND source_table = @tb ORDER BY constraint_name", new { sh = schema, tb = tableName }).ToList(); foreach (var fk in list) { string priorName = ""; bool priorDeleted = false; // eğer bir önceki ile aynıysa bunu listeye ekleme ve öncekini de sil var fkName = fk.constraint_name as string; if (priorName == fkName) { if (!priorDeleted) { foreignKeyInfos.RemoveAt(foreignKeyInfos.Count - 1); priorDeleted = true; } continue; } var foreignKeyInfo = new ForeignKeyInfo { FKName = fkName, FKSchema = fk.source_schema, FKTable = fk.source_table, FKColumn = fk.source_column, PKSchema = fk.target_schema, PKTable = fk.target_table, PKColumn = fk.target_column }; foreignKeyInfos.Add(foreignKeyInfo); priorDeleted = false; priorName = foreignKeyInfo.FKName; } } catch (Exception ex) { ex.Log(); } return(foreignKeyInfos); } if (connection.GetDialect().ServerType.StartsWith("MySql", StringComparison.OrdinalIgnoreCase)) { using (var reader = SqlHelper.ExecuteReader(connection, (String.Format(@" SELECT k.COLUMN_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME FROM information_schema.TABLE_CONSTRAINTS i LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY' AND i.TABLE_SCHEMA = '{0}' AND i.TABLE_NAME = '{1}'" , schema, tableName)))) { while (reader.Read()) { ForeignKeyInfo foreignKeyInfo = new ForeignKeyInfo(); foreignKeyInfo.FKTable = tableName; foreignKeyInfo.FKColumn = reader.GetString(0); foreignKeyInfo.PKTable = reader.GetString(1); foreignKeyInfo.PKColumn = reader.GetString(2); foreignKeyInfos.Add(foreignKeyInfo); } } return(foreignKeyInfos); } if (connection.GetDialect().ServerType.StartsWith("SqlServer", StringComparison.OrdinalIgnoreCase)) { var c = new Alias(inf + "REFERENTIAL_CONSTRAINTS", "c"); var fk = new Alias(inf + "CONSTRAINT_COLUMN_USAGE", "fk"); var pk = new Alias(inf + "KEY_COLUMN_USAGE", "pk"); var list = connection.Query <ForeignKeyInfo>(new SqlQuery() .From(c) .From(fk) .From(pk) .Where( fk._("TABLE_SCHEMA") == schema & fk._("TABLE_NAME") == tableName & fk._("CONSTRAINT_SCHEMA") == c._("CONSTRAINT_SCHEMA") & fk._("CONSTRAINT_NAME") == c._("CONSTRAINT_NAME") & pk._("CONSTRAINT_SCHEMA") == c._("UNIQUE_CONSTRAINT_SCHEMA") & pk._("CONSTRAINT_NAME") == c._("UNIQUE_CONSTRAINT_NAME")) .Select(fk["CONSTRAINT_NAME"], "FKName") .Select(fk["TABLE_SCHEMA"], "FKSchema") .Select(fk["TABLE_NAME"], "FKTable") .Select(fk["COLUMN_NAME"], "FKColumn") .Select(pk["TABLE_SCHEMA"], "PKSchema") .Select(pk["TABLE_NAME"], "PKTable") .Select(pk["COLUMN_NAME"], "PKColumn") .OrderBy(fk["CONSTRAINT_NAME"])); foreach (var foreignKeyInfo in list) { string priorName = ""; bool priorDeleted = false; // eğer bir önceki ile aynıysa bunu listeye ekleme ve öncekini de sil if (priorName == foreignKeyInfo.FKName) { if (!priorDeleted) { foreignKeyInfos.RemoveAt(foreignKeyInfos.Count - 1); priorDeleted = true; } continue; } foreignKeyInfos.Add(foreignKeyInfo); priorDeleted = false; priorName = foreignKeyInfo.FKName; } } return(foreignKeyInfos); }
public static List <FieldInfo> GetTableFieldInfos(IDbConnection connection, string schema, string tableName) { var inf = InformationSchema(connection); List <FieldInfo> fieldInfos = new List <FieldInfo>(); List <ForeignKeyInfo> foreignKeys = GetTableSingleFieldForeignKeys(connection, schema, tableName); List <string> primaryFields = GetTablePrimaryFields(connection, schema, tableName); List <string> identityFields = GetTableIdentityFields(connection, schema, tableName); var columns = ((DbConnection)((WrappedConnection)connection).ActualConnection).GetSchema("Columns", new string[] { null, schema, tableName, null }); foreach (DataRow row in columns.Rows) { /*new SqlQuery().Select("COLUMN_NAME, DATA_TYPE, IS_NULLABLE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE") * .From(inf + "COLUMNS") * .Where(new Criteria("TABLE_NAME") == tableName) * .OrderBy("ORDINAL_POSITION") * .ForEach(connection, delegate(IDataReader reader)*/ { FieldInfo fieldInfo = new FieldInfo(); fieldInfo.FieldName = row["COLUMN_NAME"] as string; fieldInfo.IsPrimaryKey = primaryFields.IndexOf(fieldInfo.FieldName) >= 0; fieldInfo.IsIdentity = identityFields.IndexOf(fieldInfo.FieldName) >= 0; fieldInfo.IsNullable = (row["IS_NULLABLE"] as string == "YES") || (row["IS_NULLABLE"] as Boolean? == true); fieldInfo.DataType = row["DATA_TYPE"] as string; fieldInfo.Size = 0; if (fieldInfo.DataType != SqlInt && fieldInfo.DataType != SqlInteger && fieldInfo.DataType != SqlReal && fieldInfo.DataType != SqlFloat && fieldInfo.DataType != SqlTinyInt && fieldInfo.DataType != SqlSmallInt && fieldInfo.DataType != SqlBigInt) { var size = row["CHARACTER_MAXIMUM_LENGTH"] as Int32?; if (size != null) { fieldInfo.Size = size.Value; if (fieldInfo.Size < 0 || fieldInfo.Size >= 1000000000) { fieldInfo.Size = 0; } } var prec = row["NUMERIC_PRECISION"] as Int32?; if (prec != null) { fieldInfo.Size = Convert.ToInt32(prec.Value); if (fieldInfo.Size < 0 || fieldInfo.Size >= 1000000000) { fieldInfo.Size = 0; } } var scale = row["NUMERIC_SCALE"] as Int32?; if (scale != null) { fieldInfo.Scale = Convert.ToInt32(scale.Value); if (fieldInfo.Scale < 0 || fieldInfo.Scale >= 1000000000) { fieldInfo.Scale = 0; } } } fieldInfos.Add(fieldInfo); } } // şimdi ForeignKey tespiti yap, bunu önceki döngüde yapamayız reader'lar çakışır foreach (FieldInfo fieldInfo in fieldInfos) { ForeignKeyInfo foreignKey = foreignKeys.Find( delegate(ForeignKeyInfo d) { return(d.FKColumn == fieldInfo.FieldName); }); if (foreignKey != null) { fieldInfo.PKSchema = foreignKey.PKSchema; fieldInfo.PKTable = foreignKey.PKTable; fieldInfo.PKColumn = foreignKey.PKColumn; } } return(fieldInfos); }
public static List <ForeignKeyInfo> GetTableSingleFieldForeignKeys(IDbConnection connection, string schema, string tableName) { var inf = InformationSchema(connection); List <ForeignKeyInfo> foreignKeyInfos = new List <ForeignKeyInfo>(); if (Dialect.HasFlag(SqlDialect.Sqlite)) { try { using (var reader = SqlHelper.ExecuteReader(connection, (String.Format("PRAGMA foreign_key_list({0});", tableName)))) { while (reader.Read()) { ForeignKeyInfo foreignKeyInfo = new ForeignKeyInfo(); foreignKeyInfo.FKTable = tableName; foreignKeyInfo.FKColumn = reader.GetString(3); foreignKeyInfo.PKTable = reader.GetString(2); foreignKeyInfo.PKColumn = reader.GetString(4); foreignKeyInfos.Add(foreignKeyInfo); } } } catch (Exception) { } return(foreignKeyInfos); } try { var c = new Alias(inf + "REFERENTIAL_CONSTRAINTS", "c"); var fk = new Alias(inf + "CONSTRAINT_COLUMN_USAGE", "fk"); var pk = new Alias(inf + "KEY_COLUMN_USAGE", "pk"); var list = connection.Query <ForeignKeyInfo>(new SqlQuery() .From(c) .From(fk) .From(pk) .Where( fk._("TABLE_SCHEMA") == schema & fk._("TABLE_NAME") == tableName & fk._("CONSTRAINT_SCHEMA") == c._("CONSTRAINT_SCHEMA") & fk._("CONSTRAINT_NAME") == c._("CONSTRAINT_NAME") & pk._("CONSTRAINT_SCHEMA") == c._("UNIQUE_CONSTRAINT_SCHEMA") & pk._("CONSTRAINT_NAME") == c._("UNIQUE_CONSTRAINT_NAME")) .Select(fk["CONSTRAINT_NAME"], "FKName") .Select(fk["TABLE_SCHEMA"], "FKSchema") .Select(fk["TABLE_NAME"], "FKTable") .Select(fk["COLUMN_NAME"], "FKColumn") .Select(pk["TABLE_SCHEMA"], "PKSchema") .Select(pk["TABLE_NAME"], "PKTable") .Select(pk["COLUMN_NAME"], "PKColumn") .OrderBy(fk["CONSTRAINT_NAME"])); foreach (var foreignKeyInfo in list) { string priorName = ""; bool priorDeleted = false; // eğer bir önceki ile aynıysa bunu listeye ekleme ve öncekini de sil if (priorName == foreignKeyInfo.FKName) { if (!priorDeleted) { foreignKeyInfos.RemoveAt(foreignKeyInfos.Count - 1); priorDeleted = true; } continue; } foreignKeyInfos.Add(foreignKeyInfo); priorDeleted = false; priorName = foreignKeyInfo.FKName; } } catch (Exception) { } return(foreignKeyInfos); }
public static List <ForeignKeyInfo> GetTableSingleFieldForeignKeys(IDbConnection connection, string tableName) { var inf = InformationSchema(connection); List <ForeignKeyInfo> foreignKeyInfos = new List <ForeignKeyInfo>(); if (Dialect.HasFlag(SqlDialect.Sqlite)) { try { using (var reader = SqlHelper.ExecuteReader(connection, (String.Format("PRAGMA foreign_key_list({0});", tableName)))) { while (reader.Read()) { ForeignKeyInfo foreignKeyInfo = new ForeignKeyInfo(); foreignKeyInfo.SourceTable = tableName; foreignKeyInfo.SourceColumn = reader.GetString(3); foreignKeyInfo.ForeignTable = reader.GetString(2); foreignKeyInfo.ForeignColumn = reader.GetString(4); foreignKeyInfos.Add(foreignKeyInfo); } } } catch (Exception) { } return(foreignKeyInfos); } try { // çift (ya da daha çok) alanlı constraint ler yapımıza uymuyor // bu yüzden constraint adına göre sıralı liste alıyoruz // tarama sırasında tek bir constraint'te birden fazla // alan bulduysak bu constraint hiç yokmuş gibi davranacağız using (var reader = SqlHelper.ExecuteReader(connection, (String.Format( "SELECT CCU.CONSTRAINT_NAME SRC_CONSTRAINT, CCU.COLUMN_NAME SRC_COL, " + "KCU.TABLE_NAME FOREIGN_TABLE, KCU.COLUMN_NAME FOREIGN_COL " + "FROM " + inf + "CONSTRAINT_COLUMN_USAGE CCU, " + inf + "REFERENTIAL_CONSTRAINTS RC, " + inf + "KEY_COLUMN_USAGE KCU " + "WHERE CCU.TABLE_NAME = {0} AND " + "CCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME AND " + "KCU.CONSTRAINT_NAME = RC.UNIQUE_CONSTRAINT_NAME " + "ORDER BY CCU.CONSTRAINT_NAME", tableName.ToSql())))) { string priorConstraint = ""; bool priorDeleted = false; while (reader.Read()) { ForeignKeyInfo foreignKeyInfo = new ForeignKeyInfo(); foreignKeyInfo.SourceConstraint = reader.GetString(0); // eğer bir önceki ile aynıysa bunu listeye ekleme ve öncekini de sil if (priorConstraint == foreignKeyInfo.SourceConstraint) { if (!priorDeleted) { foreignKeyInfos.RemoveAt(foreignKeyInfos.Count - 1); priorDeleted = true; } continue; } foreignKeyInfo.SourceTable = tableName; foreignKeyInfo.SourceColumn = reader.GetString(1); foreignKeyInfo.ForeignTable = reader.GetString(2); foreignKeyInfo.ForeignColumn = reader.GetString(3); foreignKeyInfos.Add(foreignKeyInfo); priorDeleted = false; priorConstraint = foreignKeyInfo.SourceConstraint; } } } catch (Exception) { } return(foreignKeyInfos); }
public static List <FieldInfo> GetTableFieldInfos(IDbConnection connection, string schema, string tableName) { var inf = InformationSchema(connection); List <FieldInfo> fieldInfos = new List <FieldInfo>(); List <ForeignKeyInfo> foreignKeys = GetTableSingleFieldForeignKeys(connection, schema, tableName); List <string> primaryFields = GetTablePrimaryFields(connection, schema, tableName); List <string> identityFields = GetTableIdentityFields(connection, schema, tableName); var query = "SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=@schema and TABLE_NAME = @tableName"; bool sqlite = connection.GetDialect().ServerType.StartsWith("Sqlite", StringComparison.OrdinalIgnoreCase); if (sqlite) { query = "PRAGMA table_info(@tableName)"; } var columns = connection.Query <Dictionary <string, object> >(query, new { schema, tableName }); var order = new Dictionary <string, int>(); if (!columns.Any()) { return(new List <CodeGenerator.SqlSchemaInfo.FieldInfo>()); } var first = columns.First(); var ordinal = "ORDINAL_POSITION"; var columnName = "COLUMN_NAME"; var isNullable = "IS_NULLABLE"; var charMax = "CHARACTER_MAXIMUM_LENGTH"; var numPrec = "NUMERIC_PRECISION"; var numScale = "NUMERIC_SCALE"; var dataType = "DATA_TYPE"; if (!first.ContainsKey(ordinal) && first.ContainsKey(ordinal.ToLowerInvariant())) { ordinal = ordinal.ToLowerInvariant(); columnName = columnName.ToLowerInvariant(); dataType = dataType.ToLowerInvariant(); isNullable = isNullable.ToLowerInvariant(); charMax = charMax.ToLowerInvariant(); numPrec = numPrec.ToLowerInvariant(); numScale = numScale.ToLowerInvariant(); } if (!first.ContainsKey(dataType) && first.ContainsKey("COLUMN_DATA_TYPE")) { dataType = "COLUMN_DATA_TYPE"; } if (!first.ContainsKey(charMax) && first.ContainsKey("COLUMN_SIZE")) { charMax = "COLUMN_SIZE"; } foreach (var row in columns) { FieldInfo fieldInfo = new FieldInfo(); fieldInfo.FieldName = (string)row[columnName]; order[fieldInfo.FieldName] = Convert.ToInt32(row[ordinal]); fieldInfo.IsPrimaryKey = primaryFields.IndexOf(fieldInfo.FieldName) >= 0; fieldInfo.IsIdentity = identityFields.IndexOf(fieldInfo.FieldName) >= 0; fieldInfo.IsNullable = (row[isNullable] as string == "YES") || (row[isNullable] as Boolean? == true); fieldInfo.DataType = row[dataType] as string; fieldInfo.Size = 0; if (fieldInfo.DataType != SqlInt && fieldInfo.DataType != SqlInteger && fieldInfo.DataType != SqlReal && fieldInfo.DataType != SqlFloat && fieldInfo.DataType != SqlTinyInt && fieldInfo.DataType != SqlSmallInt && fieldInfo.DataType != SqlBigInt && fieldInfo.DataType != SqlInt8 && fieldInfo.DataType != SqlInt4) { var val = row[charMax]; var size = (val == null || val == DBNull.Value) ? (Int64?)null : Convert.ToInt64(val); if (size != null && size > 0 && size <= 1000000000) { fieldInfo.Size = (int)size.Value; } val = row[numPrec]; var prec = (val == null || val == DBNull.Value) ? (Int64?)null : Convert.ToInt64(val); string dataType2; if (prec != null && (SqlTypeNameToFieldType(fieldInfo.DataType, fieldInfo.Size, out dataType2) != "String") && prec >= 0 && prec < 1000000000) { fieldInfo.Size = Convert.ToInt32(prec.Value); } val = row[numScale]; var scale = (val == null || val == DBNull.Value) ? (Int64?)null : Convert.ToInt64(val); if (scale != null && scale >= 0 && scale < 1000000000) { fieldInfo.Scale = Convert.ToInt32(scale.Value); } } fieldInfos.Add(fieldInfo); } fieldInfos.Sort((x, y) => order[x.FieldName].CompareTo(order[y.FieldName])); // şimdi ForeignKey tespiti yap, bunu önceki döngüde yapamayız reader'lar çakışır foreach (FieldInfo fieldInfo in fieldInfos) { ForeignKeyInfo foreignKey = foreignKeys.Find( delegate(ForeignKeyInfo d) { return(d.FKColumn == fieldInfo.FieldName); }); if (foreignKey != null) { fieldInfo.PKSchema = foreignKey.PKSchema; fieldInfo.PKTable = foreignKey.PKTable; fieldInfo.PKColumn = foreignKey.PKColumn; } } return(fieldInfos); }