Example #1
0
        /// <summary>
        /// 加载每个表的所有列
        /// </summary>
        /// <param name="database"></param>
        protected override void LoadAllColumns(Database database)
        {
            foreach (Table table in database.Tables)
            {
                using (var columnsReader = this.Db.QueryDataReader(@"
SELECT C.COLUMN_NAME, C.IS_NULLABLE, C.DATA_TYPE, C.CHARACTER_MAXIMUM_LENGTH
FROM INFORMATION_SCHEMA.COLUMNS C
WHERE C.TABLE_NAME = {0}
", table.Name))
                {
                    while (columnsReader.Read())
                    {
                        string columnName = columnsReader["COLUMN_NAME"].ToString();
                        string sqlType    = columnsReader["DATA_TYPE"].ToString();
                        string length     = null;
                        var    lengthObj  = columnsReader["CHARACTER_MAXIMUM_LENGTH"];
                        if (lengthObj != null && !DBNull.Value.Equals(lengthObj) && lengthObj.ToString() != "-1")
                        {
                            length = lengthObj.ToString();
                        }

                        DbType dbType = SqlDbTypeHelper.ConvertFromSQLTypeString(sqlType);
                        Column column = new Column(dbType, length, columnName, table);

                        column.IsRequired = string.Compare(columnsReader["IS_NULLABLE"].ToString(), "no", true) == 0;

                        table.Columns.Add(column);
                    }

                    table.SortColumns();
                }
            }

            this.LoadIsIdentity(database);
        }
Example #2
0
        /// <summary>
        /// 加载每个表的所有列
        /// </summary>
        /// <param name="database"></param>
        protected override void LoadAllColumns(Database database)
        {
            //用一句 Sql 将所有的表的所有字段都一次性查询出来。
            var sql = new StringBuilder(
                @"SELECT TABLE_NAME, COLUMN_NAME, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME IN (");

            sql.Append(string.Join(",", database.Tables.Select(t => "'" + t.Name + "'")));
            sql.Append(@")
ORDER BY TABLE_NAME");

            using (var columnsReader = this.Db.QueryDataReader(sql.ToString()))
            {
                Table currentTable = null;//当前正在处理的表。(放在循环外,有缓存的作用。)
                while (columnsReader.Read())
                {
                    //找到该列所对应的表。
                    var tableName = columnsReader["TABLE_NAME"].ToString();
                    if (currentTable == null || !currentTable.Name.EqualsIgnoreCase(tableName))
                    {
                        currentTable = database.FindTable(tableName);
                    }

                    string columnName = columnsReader["COLUMN_NAME"].ToString();
                    string sqlType    = columnsReader["DATA_TYPE"].ToString();

                    //不再读取 Length
                    //string length = null;
                    //var lengthObj = columnsReader["CHARACTER_MAXIMUM_LENGTH"];
                    //if (lengthObj != null && !DBNull.Value.Equals(lengthObj) && lengthObj.ToString() != "-1")
                    //{
                    //    length = lengthObj.ToString();
                    //}

                    DbType dbType = SqlDbTypeHelper.ConvertFromSQLTypeString(sqlType);

                    Column column = new Column(columnName, dbType, null, currentTable);

                    column.IsRequired = "NO".EqualsIgnoreCase(columnsReader["IS_NULLABLE"].ToString());

                    currentTable.Columns.Add(column);
                }
            }
        }
Example #3
0
 protected override string ConvertToTypeString(DbType dataType, string length)
 {
     return(SqlDbTypeHelper.ConvertToSQLTypeString(dataType, length));
 }