GetSchema («Базы данных») при подключении ODBC (C#)

Я тестирую различные способы подключения к БД на C#. В частности, я тестирую классы SqlConnection и OdbcConnection; моя БД - SQLServer Express (.\SQLEXPRESS). Оба работают достаточно хорошо, за исключением списка доступных баз данных на сервере.

В моем тестовом коде я использую объект "generic"DbConnection и простую фабрику для создания экземпляра определенных подклассов SqlConnetion и OdbcConnetion (оба они являются производными от DbConnection):

DbConnection connection;
switch (connection_type)
{
case DbConnectionType.DBCONN_MSSQL:
   connection = new SqlConnection(...sql connection string...);
   break;
case DbConnectionType.DBCONN_ODBC:
  connection = new OdbcConnection(...odbc connection string...);
  break;
}

Уловка, похоже, работает хорошо, за исключением случаев, когда я пытаюсь получить список баз данных на сервере:

DataTable databases = connection.GetSchema("Databases");
foreach (DataRow database in databases.Rows)
{
   String databaseName = database["database_name"] as String;
   Console.WriteLine(databaseName);
}

Когда "connection" является OdbcConnection (и, обратите внимание, база данных такая же), я получаю исключение, в котором говорится, что "Databases" key was not found. Я перечислил все ключи, предоставляемые GetSchema(), и версия ODBC возвращает только подмножество элементов, предоставляемых версией SQLServer. Я не смог найти никаких намеков на эту конкретную проблему. Это задокументированное / ожидаемое поведение? Я делаю что-то неправильно?

ПРИМЕЧАНИЕ: вот как я создаю строку подключения ODBC:

   OdbcConnectionStringBuilder builder;

   builder = new OdbcConnectionStringBuilder();
   builder.Driver = "SQL Server";
   builder.Add("Server", ".\\SQLEXPRESS");
   builder.Add("Uid", "");
   builder.Add("Pwd", ""); // Using current user
   builder.Add("Integrated Security", "SSPI");

   connection = new OdbcConnection(builder.ConnectionString);
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
498
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Убедитесь, что ваша модель «Базы данных» имеет действующий ключ. Добавьте аннотацию [Key] Data, если ключ, который вы хотите реализовать для этой базы данных, не соответствует правилу структуры сущности «ClassName» + «ID».

Ответ принят как подходящий

Is it a documented/expected behaviour?

Да. См. Получение информации о схеме базы данных

Am I doing something wrong?

Если ваша цель - читать метаданные SQL Server без привязки к поставщику, тогда да. Вы должны напрямую запрашивать представления каталога SQL Server. sys.databases, sys.tables и т. д.

Другие вопросы по теме