为什么返回的OleDbConnection.GetSchema(“Columns”)没有行,而相同的代码适用于OracleConnection?

为什么返回的OleDbConnection.GetSchema(“Columns”)没有行,而相同的代码适用于OracleConnection?,oracle,ado.net,oledb,Oracle,Ado.net,Oledb,我已经创建了一个实用方法来从db表中获取模式。在本例中,oracle11db public static DataTable GetColumnsSchemaTable(DbConnection cnctn, string tableName) { DataTable schemaTable; string[] restrictions = new string[3] { null, tableName, null }; sche

我已经创建了一个实用方法来从db表中获取模式。在本例中,oracle11db

    public static DataTable GetColumnsSchemaTable(DbConnection cnctn, string tableName)
    {
        DataTable schemaTable;

        string[] restrictions = new string[3] { null, tableName, null };
        schemaTable = cnctn.GetSchema("Columns", restrictions);

        /* table name is case sensitive and in XXXX db table names are UPPER */
        if (schemaTable.Rows.Count == 0)
        {
            restrictions = new string[3] { null, tableName.ToUpper(), null };
            schemaTable = cnctn.GetSchema("Columns", restrictions);
        }
        return schemaTable;
     }
当使用System.Data.OracleClient提供程序工厂创建cnctn时,这可以正常工作。使用System.Data.OleDb provider factory创建该表时,该表没有行。我还有一个获取连接字符串的实用方法:

    public static string GetDbConnectionString(DbConnection cnnctn, string provider, string server, string dbName, string user, string pwd)
    {
        if (cnnctn is OleDbConnection)
        {
            string usedProvider;
            if (provider == null)
                usedProvider = "msdaora";
            else
                usedProvider = provider;

            return string.Format("Provider={0};Data Source={1};User Id={2};Password={3};",
                    usedProvider, dbName, user, pwd);
        }
        else if (cnnctn is System.Data.OracleClient.OracleConnection)
        {
            return string.Format("Data Source={0};User Id={1};Password={2};",
                    dbName, user, pwd);
        }
        else if (cnnctn is Oracle.DataAccess.Client.OracleConnection)
        {
            return string.Format("Data Source={0};User Id={1};Password={2};",
                    dbName, user, pwd);
        }
        else if (cnnctn is SqlConnection)
        {
            return string.Format("Data Source={0}; Initial Catalog={1}; User Id={2}; Password={3};",
                server, dbName, user, pwd);
        }
        return string.Empty;
    }
db连接也可以工作(我在尝试获取模式之前删除行)。一切帮助都将不胜感激


谢谢并致以最良好的问候-马蒂

好的。我把它整理好了。我很久以前就编写了这段代码,只是为了现在不推荐使用的OracleClient,并留下了使用其他连接/提供程序工厂的可能性。我再也不记得了,每个连接的限制是不同的。因此正确的用法是:

string[] restrictions = new string[4] { null, null, tableName, null }; 

对于OLEDB连接。

似乎我必须以某种方式给出一个模式。顺便说一下,我得到了一个与其他一些表模式同名的表。我不想在代码中也给所有表一个模式名。OracleClient只喜欢表名。有什么办法吗?也许我还需要利用其他模式集合来获取模式,但是我必须知道表名的语法。正在尝试schema.table。