Агностические обработчики соединений в .NET - PullRequest
3 голосов
/ 06 января 2010

Я разрабатываю простой процессор базы данных для системы, но мне нужно поддерживать 2 базы данных, PostgreSQL и Oracle (XXg);

Пример будет такой (уже работает для pgsql)

... bunch of properties, constructors and fields

private String BuildConnectionString();

public Int32 ExecuteNonQuery(NpgsqlCommand sqlCommand);

public NpgsqlDataReader ExecuteQueryReader(NpgsqlCommand sqlCommand);

public Object ExecuteScalar(NpgsqlCommand sqlCommand);

Мне было интересно, возможно ли создать класс для обработки этих двух баз данных, используя только интерфейсы System.Data, такие как IDataReader, IDbConnection и т. Д. Я думаю, что это так, но я немного застрял, когда мне нужно создать экземпляр подключение. Пример:

    public PgSqlConnectionHandler(String username, String password, 
               String database, String server, Int32 port)
    {
        this._username = username;
        this._password = password;
        this._database = database;

        this._server = server;
        this._port = port;

        this._connection = new NpgsqlConnection(BuildConnectionString());
    }

В другом случае я бы получил (_connection is typeof (IDbConnection):

public AgnosticConnectionHandler(String userName, String password, 
               String database, String server, Int32 port)
    {
        this._userName = userName;
        this._password = password;
        this._database = database;
        this._server = server;
        this._port = port;

        this._connection = ????
    }

Есть ли быстрый способ сделать это?

Это простые запросы к базе данных, мне не нужно ничего особенного, это маленькая система.

Спасибо за внимание!

Ответы [ 3 ]

2 голосов
/ 06 января 2010

Используйте фабричный шаблон для создания соединения с базой данных.

Т.е. у вас есть статический метод, который создает соединение, в котором вы указываете, какой это тип, и всю соответствующую информацию, и он возвращает интерфейс (IDbConnection) (но правильно набран в своей конструкции).

Ядром этого метода, скорее всего, будет оператор if, который возвращает соединение Oracle или Postgre.

2 голосов
/ 06 января 2010

Вы также можете использовать OleDb провайдера данных, поскольку обе базы данных имеют провайдеров OLEDB. Если нет, у вас всегда будет ODBC, хорошо это или плохо.

alt text
(источник: microsoft.com )

2 голосов
/ 06 января 2010

Вы можете использовать интерфейс IDbConnection и создать фабрику для создания конкретных классов. Из этого интерфейса вы можете затем создать IDbCommands и присоединить соответствующие параметры и запустить их, чтобы получить DataReaders или DataSets. Я сделал это раньше с большим эффектом.

...