Почему возвращенный OleDbConnection.GetSchema («Столбцы») не имеет строк, в то время как тот же код работает для OracleConnection? - PullRequest
3 голосов
/ 09 ноября 2011

Я создал служебный метод для получения схемы из таблицы БД. В этом случае Oracle 11 дБ.

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

Это прекрасно работает, когда cnctn создается с фабрикой провайдеров System.Data.OracleClient. При создании с помощью фабрики провайдеров 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 Ответ

3 голосов
/ 09 ноября 2011

Хорошо. Я разобрался с этим. Я сделал этот код давным-давно только для устаревшего OracleClient и оставил возможность использовать другие фабрики соединений / провайдеров. Я больше не помню, чтобы ограничения менялись от соединения к соединению. Таким образом, правильное использование:

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

для OleDbConnection.

...