Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
        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);
        }