【问题标题】:Optimized way to create OracleConnection and Command objects in c#在 C# 中创建 OracleConnection 和 Command 对象的优化方法
【发布时间】:2015-07-24 13:21:24
【问题描述】:

我在 DAL 层有以下代码:

using(OracleConnection conn= new OracleConnection(connString))
using(OracleCommand cmd = new OracleCommand(sql.ToString(), conn))
{
  conn.Open();
}

上面的对象创建是在 DAL 方法的多个地方完成的。我正在寻找是否有任何方法可以优化此对象的创建,而不是在我的代码中重复多次。

任何建议/建议都会有所帮助。

谢谢, WH

【问题讨论】:

    标签: c# oracle singleton database-connection factory-pattern


    【解决方案1】:

    如果每次都需要几乎相同数量的代码来确保您正确设置它,因为它需要是一次性的,所以确实没有一种好方法可以做到这一点。除此之外的任何东西: using(OracleCommand cmd = new OracleCommand(sql.ToString(), conn)) 都会破坏连接。您是否有理由不能转而使用像实体框架这样的 ORM?除此之外,您可以创建一个返回 OracleConnection 的类,然后您将调用 .Open() ,但您需要继承 IDisposable 并在完成后调用 .Dispose() ,否则您将填满您的应用程序池。你可以在数据管理器类中做这样的事情:

    public void RunQuery(string query)
    {
        using(OracleConnection conn= new OracleConnection(connString))
        using(OracleCommand cmd = new OracleCommand(query, conn))
        {
            conn.Open();
            //do your data transaction here
         }
    }
    

    这样您就可以将查询传递到要处理的单个位置。仍然不是一个很好的解决方案,但可以让您将其保存在一个地方。要使用它:

    new YourDataClass().RunQuery("INSERT...");
    

    您将需要几个不同的类来处理选择等事情,以便在需要时返回数据。

    编辑:这只是概念性的。您将有一个数据类,只需向它发送查询。那么您就不会在任何地方复制相同的连接代码。您需要为此添加更多内容,以使其涵盖与数据库接口的所有方面,但这是一般概念。这是在一个类中编写的,并在您的应用程序中反复使用。同样,ORM 会好得多,但这将完成您想要做的事情。

    public class YourDataClass
    {
        public void RunQuery(string query) //for add, update where you don't want to return anything, could add a second parameter to send in a List<SqlParameter> to add data.
        {
            using(OracleConnection conn= new OracleConnection(connString))
            using(OracleCommand cmd = new OracleCommand(query, conn))
            {
                conn.Open();
                //do your data transaction here
    
                cmd.ExecuteNonQuery();
            }
        }
    
        public DataTable GetData(string query) //for selecting data
        {
            using(OracleConnection conn= new OracleConnection(connString))
            using(OracleCommand cmd = new OracleCommand(query, conn))
            {
                conn.Open();
                //do your data transaction here
    
                dt.Add(cmd); //add data to data table or dataset
    
                return dt;
            }
        }
    }
    

    【讨论】:

    • 谢谢@Stephen-我认为我们不想在不久的将来使用 EF。你能解释一下这是如何工作的吗? new YourDataClass().RunQuery("INSERT...");
    猜你喜欢
    • 2021-10-14
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多