Jakie są główne zalety każdej z powyższych metod połączenia z bazą danych w języku C# pod względem łączenia się z wieloma możliwymi źródłami danych (jako agnostykiem bazy danych)? Również pod względem wydajności, która może zapewnić najlepszą wydajność we wszystkich dziedzinach?DbConnection vs OleDbConnection vs OdbcConnection
Wreszcie, czy są jakieś powody, dla których można by uniknąć konkretnej metody dla agnostycznej aplikacji bazy danych?
Powodem, dla którego pytam, jest to, że moja aplikacja obecnie używa Ole i mam kilka problemów z łączeniem się z pewnymi bazami danych za pomocą fabryk i jako takie szukam alternatyw. Słyszałem, że Odbc jest wolniejszy niż Ole, ale czy jest za tym jakaś prawda i czy jest naprawdę zauważalna w prawdziwym świecie?
Powód mojego zainteresowania w tej sprawie jest następujące:
moje wymagania dla mojego obecnego stanu projektu, że muszę mieć pracę warstwę dostępu do danych, które są zdolne do podłączenia do dowolnej bazy danych bez uprzedniej znajomości powiedział Baza danych. Dlatego nie mogę napisać nic konkretnego dla danej bazy danych pod względem połączenia. Uruchamianie specyficznych instrukcji dialektu dla każdej bazy danych zostało rozwiązane przy użyciu koncepcji typu fabryki zapytań sql. To samo dotyczy podstawiania i formatowania zmiennych wiązania.
AKTUALIZACJA: W obecnej wersji mam działającą wersję mojego kodu, który wykorzystuje ADO.net i fabryki dostawców baz danych. Oznacza to, że używam klas bazowych zgodnie z sugestią Adama Houldswortha. Dostawca jest określony w ciągu połączenia pod atrybutem providerName. Ciąg połączenia jest przechowywany w pliku app.config, gdzie można go pobrać przez moją klasę połączenia z bazą danych. Pod warunkiem, że został zainstalowany odpowiedni sterownik, taki jak npgsql lub pakiet odac dla Oracle, wtedy fabryka będzie działać poprawnie. Poniżej znajduje się przykład mojego kodu pokazujący podstawowy konstruktor obiektu połączenia przy użyciu fabryki dostawców.
private readonly DbFactoryBindVariables m_bindVariables;
private readonly DbProviderFactory m_provider;
private string m_connectionString = String.Empty;
private readonly string m_providerName = String.Empty;
private DbConnection m_dbFactoryDatabaseConnection;
/// <summary>
/// Default constructor for DbFactoryDatabaseConnection.
/// </summary>
public DbProviderFactoryConnection()
{
m_providerName = ConfigurationManager.ConnectionStrings["ApplicationDefault"].ProviderName;
m_provider = DbProviderFactories.GetFactory(m_providerName);
m_dbFactoryDatabaseConnection = m_provider.CreateConnection();
m_connectionString = ConfigurationManager.ConnectionStrings["ApplicationDefault"].ConnectionString;
m_dbFactoryDatabaseConnection.ConnectionString = m_connectionString;
m_bindVariables = new DbFactoryBindVariables(m_dialect.ToLower(), DbFactoryBindSyntaxLoader.Load(this));
}
To może być wymagane, aby dodać coś podobnego do następującego w app.config lub web.config, jeśli nie jest już obecna w machine.config dla wybranej wersji .NET Framework.
<system.data>
<DbProviderFactories>
<add name="Npgsql Data Provider"
invariant="Npgsql"
support="FF"
description=".Net Framework Data Provider for Postgresql Server"
type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.1.0, Culture=neutral,
PublicKeyToken=5d8b90d52f46fda7" />
</DbProviderFactories>
</system.data>
ciąg połączenia wymagane:
<add name="ApplicationDefault" connectionString="DATA SOURCE=TNSNAME;PASSWORD=PASS;USER ID=USER;" providerName="Oracle.DataAccess.Client;"/>
Na tym etapie mogę teraz być całkowicie niezależne od bazy danych pod warunkiem prawidłowego ciąg połączenia jest używany podczas konfigurowania wersji klientów aplikacji.
Dodano aktualizację dla zainteresowanych. – CSharpened