Каков наилучший способ подключения к локальной базе данных, которая будет использоваться двумя приложениями? - PullRequest
1 голос
/ 04 января 2012

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

class conexionBD
{
    string connString;

    protected void miConexion(string ruta)
    {
        connString = String.Concat("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=", ruta);
    }

    protected DataTable misEmpleados()
    {            
        string query = "SELECT Fiel1, Field2 FROM Table1";
        DataTable dTable = miDatatable(query);
        return dTable;
    }    

    protected DataColumn misDptos()
    {
        DataTable dTable = miDatatable("SELECT OtherField from OtherTable");
        return dTable.Columns[0];       
    }

    private DataTable miDatatable(string sqlQuery)
    {
        OleDbDataAdapter dAdapter = new OleDbDataAdapter(sqlQuery, connString);
        OleDbCommandBuilder cBuilder = new OleDbCommandBuilder(dAdapter);
        DataTable dTable = new DataTable();
        dAdapter.Fill(dTable);
        return dTable;        
    }    
}

Приложение вызывает метод «miConexion», чтобы установить путь к базе данных на жестком диске. Затем приложение подключается и отключается каждый раз, когда я хочу получить данные, хранящиеся в «Table1» и «OtherTable».

База данных, вероятно, будет доступна и изменена обоими приложениями одновременно. «Подключение и отключение» - лучший способ получить доступ к базе данных в этом случае?

Ответы [ 4 ]

1 голос
/ 04 января 2012

есть 3 улучшения, которые вы можете сделать:

  1. абстракция конкретного адаптера базы данных в файл конфигурации.
  2. избавьтесь от объектов ado.net, когда закончите с ними
  3. использовать транзакцию при чтении и записи в / из БД.
0 голосов
/ 04 января 2012

Это модификация метода «miDatatable», он подключается к базе данных Access:

private DataTable miDatatable(string sqlQuery)
        {
            using (OleDbConnection connDB = new OleDbConnection(connString))
            {
                OleDbDataAdapter dAdapter;
                OleDbCommandBuilder cBuilder;
                OleDbCommand command = new OleDbCommand();
                DataTable dTable = new DataTable();
                OleDbTransaction trans = null;

                try
                {
                    connDB.Open();
                    trans = connDB.BeginTransaction(IsolationLevel.ReadCommitted);

                    command.Connection = connDB;
                    command.Transaction = trans;
                    command.CommandText = sqlQuery;

                    dAdapter = new OleDbDataAdapter(sqlQuery, connDB);
                    cBuilder = new OleDbCommandBuilder(dAdapter);

                    dAdapter.SelectCommand.Transaction = trans;
                    dAdapter.Fill(dTable);
                    trans.Commit();
                }

                catch 
                {
                    try
                    {
                        trans.Rollback();
                    }
                    catch { }
                }

                return dTable;
            }
        }
0 голосов
/ 04 января 2012

Используйте ORM, такой как Entity Framework (EF) или NHibernate, чтобы управлять состоянием объекта (если оба приложения .Net)

Я бы порекомендовал NHibernate, поскольку вы используете адаптер данных OLE (но посмотрите, есть ли какие-либо коннекторы для базы данных, которую вы используете для EF, так как ее гораздо проще настроить) ..

0 голосов
/ 04 января 2012

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

Тогда вам потребуется использовать транзакции .

Также убедитесь, что вы открываете и закрываете соединение, и соединение остается открытым в течение кратчайшего времени.Стек OleDb действительно старый, если это новое приложение, подумайте о переходе на ORM или хотя бы ADO.NET.

...