You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Zero/ZeroLevel.SQL/SqlServerEntities/SqlDbTableInfo.cs

125 lines
4.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
namespace ZeroLevel.SqlServer
{
/// <summary>
/// Описание таблицы в БД
/// </summary>
public sealed class SqlDbTableInfo : TableInfo, IEquatable<SqlDbTableInfo>
{
#region Ctor
/// <summary>
/// Конструктор по-умолчанию
/// </summary>
/// <param name="name"></param>
public SqlDbTableInfo(string name) : base(name)
{
}
/// <summary>
/// Конструктор по-умолчанию
/// </summary>
/// <param name="name"></param>
public SqlDbTableInfo(SqlDbTableInfo other) : base(other)
{
}
#endregion
#region IEquatable
/// <summary>
/// Сравнение с другой таблицей
/// </summary>
public bool Equals(SqlDbTableInfo other)
{
return base.Equals(other);
}
#endregion
#region Fill table info
protected override IEnumerable<IndexInfo> GetIndexes(IDbProvider db)
{
var indexes = new List<IndexInfo>();
string select = "exec sp_indexes_rowset [{0}]";
using (var ds = db.ExecuteQuerySqlDataSet(string.Format(select, _name)))
{
using (var indexInfo = ds.Tables[0])
{
foreach (DataRow row in indexInfo.Rows)
{
var i = new IndexInfo
{
Name = (string)row["INDEX_NAME"],
IsPrimaryKey = (bool)row["PRIMARY_KEY"],
IsUnique = (bool)row["UNIQUE"]
};
i.Columns.Add((string)row["COLUMN_NAME"]);
indexes.Add(i);
}
}
}
return indexes;
}
protected override IEnumerable<ColumnInfo> GetColumns(IDbProvider db)
{
// Для уменьшения количества обращения к базе все данные по таблице в одном запросе
var columns = new List<ColumnInfo>();
string select = @"exec sp_columns [{0}]
SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='{0}'
exec sp_pkeys @table_name = [{0}]";
using (var ds = db.ExecuteQuerySqlDataSet(string.Format(select, _name)))
{
if (ds.Tables.Count != 3)
{
throw new InvalidOperationException("Не удалось получить данные по таблице " + _name);
}
var columnTypes = new Dictionary<string, string>();
var columnSize = new Dictionary<string, long>();
using (var dataTypeInfo = ds.Tables[1])
{
foreach (DataRow row in dataTypeInfo.Rows)
{
columnTypes.Add((string)row["COLUMN_NAME"], (string)row["DATA_TYPE"]);
var maximum = row["CHARACTER_MAXIMUM_LENGTH"];
columnSize.Add((string)row["COLUMN_NAME"], (maximum != DBNull.Value) ? Convert.ToInt64(row["CHARACTER_MAXIMUM_LENGTH"]) : 0);
}
}
using (var tableInfo = ds.Tables[0])
{
foreach (DataRow row in tableInfo.Rows)
{
var column = new ColumnInfo();
column.Name = (string)row["COLUMN_NAME"];
column.Size = columnSize[column.Name];
column.DbType = columnTypes[column.Name];
column.AllowNull = (short)row["NULLABLE"] == 1;
column.DotNetType = DbTypeMapper.ToClrType(columnTypes[column.Name]);
column.AutoInc = ((string)row["TYPE_NAME"]).Contains("identity");
columns.Add(column);
}
}
using (var pkInfo = ds.Tables[2])
{
if (pkInfo.Rows.Count > 0 && pkInfo.Rows[0].ItemArray.Length > 3)
{
var primaryKeyName = pkInfo.Rows[0][3].ToString();
var pc = columns.First(c => c.Name.Equals(primaryKeyName, StringComparison.OrdinalIgnoreCase));
pc.IsPrimaryKey = true;
}
}
}
return columns;
}
#endregion
public override int GetHashCode()
{
return base.GetHashCode();
}
}
}

Powered by TurnKey Linux.