ASP.NET: как поддерживать два типа баз данных в одном приложении?(Access, MS SQL Server 2008 Express) - PullRequest
3 голосов
/ 24 сентября 2010

Разрабатываемое веб-приложение ASP.NET должно поддерживать два различных типа баз данных, а именно Access и MS SQL Server 2008 Express.

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

Большая проблема возникает с объектами базы данных.Для Access, который я уже реализовал, я использую объекты OleDbConnection, OleDbCommand и OleDbDataReader в коде для выполнения вызовов базы данных.

Похоже, что для SQL Server я не могу использовать эти объекты, а скорее мне нужно будет использовать объекты SqlConnection, SqlCommand и SqlDataReader, чтобы делать по существу одни и те же вещи.

Я хочу использовать как можно больше моего текущего кода, и мне не нужно создавать два отдельных блока для каждого типа базы данных.(У меня есть много методов, которые принимают OleDbDataReader в качестве параметра - я не хочу, например, делать 2 из каждого из этих методов.)

Я заметил, что оба объекта подключения наследуются от DbConnection,И то же самое верно для считывателей данных (DbDataReader) и команд (DbCommand).

Можно ли взять мой существующий код для Access, заменить все объекты Ole объектами Db, а затем привести эти объекты к нужному типу в зависимости от текущего типа базы данных?

Существуют ли рекомендации по поддержке двух типов баз данных в одном приложении ASP.NET?

Я могу добавить часть своего кода, если это поможет.Спасибо.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2010

Ссылка, которую вы, вероятно, упускаете, - это функциональность класса DbProviderFactories.Используя этот класс (и связанные помощники также в System.Data.Common), вы можете абстрагировать провайдера и использовать ссылки на базовые классы (такие как DbConnection и DbCommand) для выполнения работы.Это выглядело бы примерно так:

private void DoSomething(string provider, string connectionString, string something)
{    
    DbProviderFactory factory = DbProviderFactories.GetFactory(provider);
    DbConnection connection = factory.CreateConnection();
    connection.ConnectionString = connectionString;
    DbCommand command = connection.CreateCommand();
    command.CommandText = something;
    DbDataReader reader = command.ExecuteReader();
    //etc...
}

Имя провайдера немного сложно получить, но оно должно быть именем инвариантного класса, которое совпадает с одним из возвращаемых DbProviderFactories.GetFactoryClasses ().Или вы можете просто жестко их кодировать.Они не сильно меняются, но является волшебной строкой, встроенной в ваш код, и в конечном итоге может вызвать проблемы.

Дополнительные фабрики могут быть доступны через factory.CreateCommandBuilder, который может помочь вам пройтиразличия в том, как провайдеры обрабатывают такие вещи, как параметры и тому подобное.

0 голосов
/ 24 сентября 2010

Да, из фреймворка 2.0 все устройства чтения данных наследуются от класса DbDataReader, поэтому ваши методы могут принимать DbDataReader вместо OleDbDataReader, и вы можете использовать методы с любой базой данных.

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

Конкретным примером различий является то, что Access использует литералы данных, такие как #2010-09-24#, тогда как SQL Server использует литералы даты, такие как '2010-09-24'. Как правило, большинство, что связано с датами, отличается.

...