Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 连接两个应用程序将使用的本地数据库的最佳方式是什么?_C#_Sql Server_Database Connection_Oledb - Fatal编程技术网

C# 连接两个应用程序将使用的本地数据库的最佳方式是什么?

C# 连接两个应用程序将使用的本地数据库的最佳方式是什么?,c#,sql-server,database-connection,oledb,C#,Sql Server,Database Connection,Oledb,我正在用C#编写一个应用程序,它连接到其他应用程序使用的数据库。我正在编写访问数据库的类,如下所示: class conexionBD { string connString; protected void miConexion(string ruta) { connString = String.Concat("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=", ruta); } prote

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

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

数据库可能会被两个应用程序同时访问和修改 同时

那么你就需要使用

还要检查您是否打开和关闭连接,以及连接是否在尽可能短的时间内保持打开状态。如果这是一个新的应用程序,考虑到ORM或至少ADO.NET./P>,OLeDB堆栈就很旧了。 数据库可能会被两个应用程序同时访问和修改 同时

那么你就需要使用


还要检查您是否打开和关闭连接,以及连接是否在尽可能短的时间内保持打开状态。OLeDB堆栈是很旧的,如果这是一个新的应用程序,考虑移动到ORM或至少ADO.NET .< /P> < P>,您可以做3个改进:

  • 将特定数据库适配器抽象到配置文件
  • 处理完ado.net对象后,请将其丢弃
  • 在读写数据库时使用事务

  • 您可以进行3项改进:

  • 将特定数据库适配器抽象到配置文件
  • 处理完ado.net对象后,请将其丢弃
  • 在读写数据库时使用事务

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


    我建议使用NHibernate,因为您正在使用OLE数据适配器(但请查看是否有用于EF的数据库的连接器,因为它更易于设置)

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


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

    这是对“MIDATABLE”方法的修改,它连接到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;
                }
            }
    

    这是对“MIDATABLE”方法的修改,它连接到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;
                }
            }
    

    对这个问题的回答可能会给你一些启示:对这个问题的回答可能会给你一些启示: