Я тестирую различные способы подключения к БД на 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);





Убедитесь, что ваша модель «Базы данных» имеет действующий ключ. Добавьте аннотацию [Key] Data, если ключ, который вы хотите реализовать для этой базы данных, не соответствует правилу структуры сущности «ClassName» + «ID».
Is it a documented/expected behaviour?
Да. См. Получение информации о схеме базы данных
Am I doing something wrong?
Если ваша цель - читать метаданные SQL Server без привязки к поставщику, тогда да. Вы должны напрямую запрашивать представления каталога SQL Server. sys.databases, sys.tables и т. д.