【问题标题】:What is the best way to connect to a local database that will be used by two apps?连接到将由两个应用程序使用的本地数据库的最佳方法是什么?
【发布时间】:2012-02-01 20:17:48
【问题描述】:

我正在用 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”中的数据时,应用程序都会连接和断开连接。

数据库很可能同时被两个应用程序访问和修改。 “连接和断开”是这种情况下访问数据库的最佳方式吗?

【问题讨论】:

标签: c# sql-server database-connection oledb


【解决方案1】:

这是对“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;
            }
        }

【讨论】:

    【解决方案2】:

    使用像实体框架 (EF) 或 NHibernate 这样的 ORM 来管理对象的状态(如果两个应用程序都是 .Net)

    我会推荐 NHibernate,因为您使用的是 OLE 数据适配器(但请查看您用于 EF 的数据库是否有任何连接器,因为它更容易设置)..

    【讨论】:

      【解决方案3】:

      您可以进行 3 项改进:

      1. 将特定的数据库适配器抽象到配置文件中。
      2. 使用完 ado.net 对象后将其丢弃
      3. 在读取和写入数据库时​​使用事务。

      【讨论】:

        【解决方案4】:

        数据库很可能同时被两个应用程序访问和修改 同一时间。

        那么你需要使用transactions

        还要检查您是否打开和关闭了连接,并且连接会在尽可能短的时间内保持打开状态。如果这是一个新应用程序考虑迁移到 ORM 或至少 ADO.NET,OleDb 堆栈真的很旧。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-02-11
          • 1970-01-01
          • 2010-11-02
          • 2010-12-08
          • 1970-01-01
          • 1970-01-01
          • 2015-09-02
          • 2012-01-05
          相关资源
          最近更新 更多