Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从数据库连接检索所有视图(对于常见的数据库类型)_C#_Datatable_Database Schema - Fatal编程技术网

C# 从数据库连接检索所有视图(对于常见的数据库类型)

C# 从数据库连接检索所有视图(对于常见的数据库类型),c#,datatable,database-schema,C#,Datatable,Database Schema,我正在尝试创建一个函数来返回来自泛型数据库连接的所有视图名称。我希望它能适用于尽可能多的数据库类型,但如果排除一些深奥的DB类型,我不介意 在我当前的代码中,我对Oracle有一些特殊的逻辑,但我无法摆脱这样的感觉:我的代码没有以非常健壮的方式处理事情: Collection<string> Views { get { using (var dtViews = dbConnection.GetSchema("Views")) /

我正在尝试创建一个函数来返回来自泛型数据库连接的所有视图名称。我希望它能适用于尽可能多的数据库类型,但如果排除一些深奥的DB类型,我不介意

在我当前的代码中,我对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;
}
集合视图
{
得到
{
使用(var dtViews=dbConnection.GetSchema(“视图”))
//确定检索所有表和视图的正确方法
返回((dbType==dbTypeEnum.Oracle)?GetAllViewsOracle(dtViews):GetAllViews(dtViews));
}
}
静态集合GetAllView(数据表dt)
{
返回GetSingleDataTableCol(dt.Select(“,“TABLE_NAME ASC”),dt.Columns[“TABLE_NAME”]);
}
静态集合GetAllViewsOracle(数据表dtViews)
{
如果(!dtViews.Columns.Contains(“所有者”))
返回GetAllViews(dtViews);
如果(!dtViews.Columns.Contains(“视图名称”))
返回新集合();
返回GetSingleDataTableCol(dtViews.Select(“所有者不在('SYS','SYSTEM')”,“视图名称ASC”),dtViews.Columns[“视图名称”]);
}
受保护的静态集合GetSingleDataTableCol(DataRow[]行,DataColumn列)
{
var lCol=新列表();
如果(列!=null)
{
foreach(数据行行中的rowTable)
{
添加(行表[col].ToString());
}
}
返回lCol;
}
对于Oracle,我过滤“SYS”和“SYSTEM”模式/所有者,因为Oracle有一堆我永远不会使用的特殊表


理想情况下,我甚至不想用特殊的逻辑处理Oracle/其他人。我是否可以获得比当前更通用的所有视图?

您可以查看
GetSchema(string,string[])
重载:。“视图”的过滤器参数可能适用于所有db类型。我认为您可能在OracleClient和SqlClient方面取得了一些成功,但我不知道您的代码与其他db的其他ADO.Net提供程序实现的情况如何。但是,关于您的问题,您可能想看一看,其中讨论了从
GetSchema()
提取数据的限制。我仍然认为,使用一些特定于DBMS的代码的方法可能是最好的选择。