Извлечение всех представлений из DbConnection (для распространенных типов БД)

#c# #datatable #database-schema

#c# #datatable #база данных-схема

Вопрос:

Я пытаюсь создать функцию для возврата всех имен представлений из общего DbConnection. Я бы хотел, чтобы это работало для как можно большего числа типов баз данных, но если я исключу некоторые эзотерические типы БД, я не возражаю.

В моем текущем коде у меня есть некоторая специальная логика для Oracle, но я не могу избавиться от ощущения, что мой код обрабатывает вещи не очень надежным образом:

 Collection<string> Views
{
    get
    {
        using (var dtViews = dbConnection.GetSchema("Views"))
            // Determine the proper method to retrieve all tables and views
            return ((dbType == dbTypeEnum.Oracle) ? GetAllViewsOracle(dtViews) : GetAllViews(dtViews));
    }
}
static Collection<string> GetAllViews(DataTable dt)
{
    return GetSingleDataTableCol(dt.Select("", "TABLE_NAME ASC"), dt.Columns["TABLE_NAME"]);
}
static Collection<string> GetAllViewsOracle(DataTable dtViews)
{
    if (!dtViews.Columns.Contains("OWNER"))
        return GetAllViews(dtViews);
    if (!dtViews.Columns.Contains("VIEW_NAME"))
        return new Collection<string>();
    return GetSingleDataTableCol(dtViews.Select("OWNER NOT IN ('SYS','SYSTEM')", "VIEW_NAME ASC"), dtViews.Columns["VIEW_NAME"]);
}
protected static Collection<string> GetSingleDataTableCol(DataRow[] rows, DataColumn col)
{
    var lCol = new List<string>();

    if (col != null)
    {
        foreach (DataRow rowTable in rows)
        {
            lCol.Add(rowTable[col].ToString());
        }
    }

    return lCol;
}
  

В Oracle я фильтрую схемы / владельцев «SYS» и «SYSTEM», поскольку в Oracle есть куча специальных таблиц, которые я никогда не буду использовать.

В идеале мне бы даже не хотелось обрабатывать Oracle / другие с помощью специальной логики. Могу ли я получить все представления в более общем виде, чем я обрабатываю в настоящее время?

Комментарии:

1. Вы могли бы посмотреть на GetSchema(string, string[]) перегрузку: msdn.microsoft.com/en-us/library/y53he2tz.aspx . Параметры фильтра для «Представлений» могут быть обобщены для всех типов БД.

2. Я думаю, у вас может быть некоторый успех с OracleClient и SqlClient, но я не знаю, как ваш код работает с другими ADO.Net реализации провайдера для других БД. Но, в связи с вашим вопросом, вы, возможно, захотите взглянуть на эту статью , в которой обсуждаются ограничения на извлечение данных из GetSchema() . Я все еще думаю, что подход, при котором у вас есть некоторый специфичный для СУБД код, вероятно, будет вашим лучшим выбором.