Как я должен определить тип столбца базы данных агностическим способом, используя DbConnection.GetSchema? - PullRequest
0 голосов
/ 16 июля 2009

Я хочу позволить пользователю определить запрос, который будет использоваться для получения некоторой информации. База данных, к которой подключается пользователь, также определяется пользователем. В основном, шаги, которые пользователь должен выполнить:

1 / Выберите провайдера данных (это один из провайдеров, возвращаемых DbProviderFactories.GetFactoryClasses ())

2 / Сконфигурируйте выбранного провайдера, заполнив сетку свойств, которая привязана к DbConnectionStringBuilder, возвращенному выбранным DbProviderFactory.

3 / Выберите таблицу, с которой будет работать запрос. Список таблиц происходит из DbConnection.GetSchema («Таблицы») (с DbConnection, исходящим из выбранного DbProviderFactory)

4 / Выберите столбцы (необходимо 2 столбца), которые содержат данные, необходимые для запроса. Один из этих столбцов должен быть либо текстом, либо целым числом, а другой - числовым.

Мне удалось успешно выполнить первые 3 шага, но я столкнулся с проблемой на шаге 4. Первоначально я был подключен к базе данных сервера SQL и получил все работает. Теперь, когда я попробовал его с базой данных oracle XE, у меня возникла проблема.

Использование базы данных SQLServer2005, когда я запрашиваю DATA_TYPES из схемы, я получаю такую ​​информацию, как:

Type name     ProviderDbType    DataType

nchar           10              System.String
int           8               System.Int32

и когда я запрашиваю схему для столбцов в моей таблице, я получаю:

Column_Name     Data_Type
Id               nchar
Length           int

Таким образом, при попытке сопоставить тип столбца (через значение столбца Data_type) с типом системы, который я ввел для Type_name из таблицы схемы DATA_TYPES. Все было хорошо.

Затем я начал использовать oracle (через Odbc. Хотя информация DATA_TYPES, кажется, та же самая, что я получаю из запроса столбцов, отличается. То, что я получаю, это:

Column_Name     Data_Type   Type_Name
Id                   8         VARCHAR2
Length              10         int

, поэтому моя предыдущая стратегия ввода Type_Name из таблицы схемы DATA_TYPES и поиска значения Data_Type для получения типа системы не работает, поскольку он сохраняет тип системы с помощью ключа nchar, а затем пытается найти его с ключом 8.

просматривая различные вещи, доступные в схеме, я не могу понять, как я должен знать, какой столбец в запросе столбцов соответствует какому столбцу в таблице схемы DATA_TYPES.

Извиняюсь за длинный вопрос, надеюсь, проблема ясна.

Ответы [ 2 ]

1 голос
/ 16 июля 2009

Вы не должны требовать от пользователя выбора провайдера. Позвольте пользователю выбрать базу данных и заставить приложение выяснить, какого поставщика использовать.

Если вы используете поставщика OLE DB, можете ли вы использовать OleDbType Enumeration ?

Существует встроенный .NET и собственный поставщик OLE DB для Oracle.

См. Также Отображения типов данных в ADO.NET

1 голос
/ 16 июля 2009

Лучше всего написать функцию-оболочку на уровне приложения, которая содержит определенный код для интерпретации каждой БД и затем возвращает общий формат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...