Я пытаюсь создать функцию, которая будет возвращать все имена представлений из общего 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 / другими со специальной логикой. Могу ли я получить все виды более обобщенно, чем я сейчас обрабатываю?