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

时间:2011-11-09 14:25:11

标签: oracle ado.net oledb

我已经创建了一个实用程序方法来从db表中获取模式。在这种情况下,Oracle 11 db。

    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提供程序工厂创建它时,表没有行。我有另一个实用工具方法来获取连接字符串:

    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;
    }

并且数据库连接正常工作(我在尝试获取架构之前删除了行)。所有帮助将不胜感激。

谢谢&最诚挚的问候 - 马蒂

1 个答案:

答案 0 :(得分:3)

确定。我整理出来了。我很久以前制作这段代码只是为了现在已经弃用的OracleClient并且留下了使用其他连接/提供者工厂的可能性。我不记得这些限制因连接而异。所以正确的用法是:

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

用于OleDbConnection。