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/SqlDbInfo.cs

204 lines
6.5 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.Globalization;
namespace ZeroLevel.SqlServer
{
public sealed class SqlDbInfo
{
#region Ctor
public SqlDbInfo(SqlDbProvider provider)
{
_provider = provider;
}
#endregion
private static string FixTableName(string tableName)
{
return tableName.Trim().ToLower();
}
public void CollectDatabaseInfo(bool tables, bool views, bool storedProcedures)
{
if (tables)
CollectTableInformation();
}
public SqlDbTableInfo this[string tableName]
{
get
{
tableName = FixTableName(tableName);
if (_tables.ContainsKey(tableName))
{
return _tables[tableName];
}
throw new KeyNotFoundException("Таблица " + tableName + " отсутствует в базе " + _provider.Server + "\\" + _provider.Base);
}
}
#region Private Fields
private readonly SqlDbProvider _provider;
private readonly Dictionary<string, SqlDbTableInfo> _tables = new Dictionary<string, SqlDbTableInfo>();
private readonly List<SqlDbForeignKeyInfo> _foreignKeys = new List<SqlDbForeignKeyInfo>();
private readonly List<SqlDbPrimaryKeyInfo> _primaryKeys = new List<SqlDbPrimaryKeyInfo>();
private readonly List<SqlDbObjectInfo> _storedProcedures = new List<SqlDbObjectInfo>();
private readonly List<SqlDbObjectInfo> _views = new List<SqlDbObjectInfo>();
#endregion
#region Public database info
public IEnumerable<string> Tables
{
get
{
return _tables.Keys;
}
}
public IEnumerable<SqlDbTableInfo> TablesInfo
{
get
{
return _tables.Values;
}
}
public IEnumerable<SqlDbPrimaryKeyInfo> PrimaryKeys
{
get
{
return _primaryKeys;
}
}
public IEnumerable<SqlDbForeignKeyInfo> ForeignKeys
{
get
{
return _foreignKeys;
}
}
public IEnumerable<SqlDbObjectInfo> StoredProcedures
{
get
{
return _storedProcedures;
}
}
public IEnumerable<SqlDbObjectInfo> Views
{
get
{
return _views;
}
}
#endregion
#region Public methods
public bool ContainTable(string tableName)
{
tableName = FixTableName(tableName);
return _tables.ContainsKey(tableName);
}
public bool ContainPrimaryKey(SqlDbPrimaryKeyInfo pk)
{
return _primaryKeys.Contains(pk);
}
public bool ContainForeignKey(SqlDbForeignKeyInfo fk)
{
return _foreignKeys.Contains(fk);
}
public SqlDbTableInfo TableInfo(string tableName)
{
tableName = FixTableName(tableName);
if (ContainTable(tableName))
{
return _tables[tableName];
}
return null;
}
#endregion
#region Helpers
/// <summary>
/// Сбор информации о таблицах, перчиных и внешних ключах
/// </summary>
private void CollectTableInformation()
{
// Таблицы
foreach (string table in GetTables())
{
SqlDbTableInfo info = GetTableInfo(table);
if (info != null)
{
string tableName = FixTableName(info.Name);
_tables.Add(tableName, info);
if (info.PrimaryKey != null)
{
_primaryKeys.Add(new SqlDbPrimaryKeyInfo { PrimaryKeyTable = tableName, PrimaryKeyColumn = info.PrimaryKey.Name });
}
}
}
// Внешние ключи
DataSet fkSet = _provider.ExecuteQuerySqlDataSet(SqlDbForeignKeyInfo.ForeignKeySelectQuery);
if (fkSet != null && fkSet.Tables.Count > 0)
{
foreach (DataRow row in fkSet.Tables[0].Rows)
{
_foreignKeys.Add(new SqlDbForeignKeyInfo
{
ForeignKeyName = Convert.ToString(row["Constraint_Name"], CultureInfo.CurrentCulture),
ForeignKeyTable = FixTableName(Convert.ToString(row["K_Table"], CultureInfo.CurrentCulture)),
ForeignKeyColumn = Convert.ToString(row["FK_Column"], CultureInfo.CurrentCulture),
PrimaryKeyTable = FixTableName(Convert.ToString(row["PK_Table"], CultureInfo.CurrentCulture)),
PrimaryKeyColumn = Convert.ToString(row["PK_Column"], CultureInfo.CurrentCulture)
});
}
}
}
#region Private
/// <summary>
/// Получение списка таблиц из базы данных
/// </summary>
private List<string> GetTables()
{
var tables = new List<string>();
using (DataSet ds = _provider.ExecuteQuerySqlDataSet("exec sp_tables"))
{
if (ds != null && ds.Tables.Count > 0)
{
foreach (DataRow row in ds.Tables[0].Rows)
{
if (String.Equals(row.ItemArray[3].ToString(), "TABLE", StringComparison.OrdinalIgnoreCase) &&
(false == String.Equals(row.ItemArray[1].ToString(), "sys", StringComparison.OrdinalIgnoreCase)))
tables.Add(FixTableName(row.ItemArray[2].ToString()));
}
}
}
return tables;
}
/// <summary>
/// Получение информации о таблице по ее имени
/// </summary>
public SqlDbTableInfo GetTableInfo(string table)
{
if (String.IsNullOrEmpty(table))
{
throw new ArgumentNullException("table");
}
var info = new SqlDbTableInfo(FixTableName(table));
info.FillTableInfo(_provider);
return info;
}
#endregion
#endregion
}
}

Powered by TurnKey Linux.