【问题标题】:How do you manage database connections and transactions across inserts in an Object Oriented way, using VB.net or C#?如何使用 VB.net 或 C# 以面向对象的方式跨插入管理数据库连接和事务?
【发布时间】:2009-04-16 14:07:21
【问题描述】:

我现在在我的编程开发中,我正试图利用面向对象的设计,而不是我一直在做的按钮程序背后的基本功能。

在当前项目中,我正在重复、复制和粘贴 sql server 插入代码,并将其迁移到具有属性、方法等的类...

我遇到的一个问题是如何保持与数据库的低连接,同时在多个对象和多个表之间进行插入。

我一直在使用 ADO.net 事务写入一个表,然后根据插入记录的 ID,将附加信息写入另一个表,而不关闭连接,直到第二个作业完成。我使用事务,所以如果后面的插入失败,第一次插入可以撤消,并使用try,catch,finally来关闭连接,无论成功还是失败。

在面向对象的世界中你如何处理这个问题?

编辑:感谢大家的回答。我得到它。这是另一个问题,也有助于我澄清:ASP.NET/ADO.NET: Handling many database connections inside a .NET Object?

【问题讨论】:

    标签: c# vb.net oop database-connection


    【解决方案1】:

    嗯,差别不大。

    您的“对象”(我假设您的意思是您正在使用类;这些类的实例代表您业务领域中的“项目”),不应该关心这些事务。 也就是说,他们不应该知道交易,他们不应该负责处理交易。

    事务应该由另一个对象发起和处理。某种“经理”。此类启动、提交和回滚事务。
    您将在您的应用程序中使用此管理器,例如在您的表单中。
    对我来说,这是处理事务的唯一正确方法,因为您的应用程序知道“上下文”。您的应用程序知道您必须对数据库执行多少次往返,应用程序知道事务应该持续多长时间。您的对象不知道这一点。

    【讨论】:

    • 你的假设是正确的......代表业务领域项目的类和类实例)......“经理”类是什么样的?
    • 而且...如果我不使用 sql 事务,我假设如果第二级插入失败,管理器类必须处理删除新创建的第一级插入?
    • 嗯,我不认为我会走这么远......这是程序员/用户恕我直言的责任。在我的情况下,我的“经理”只是 NH​​ibernate ISession 对象的包装器,它具有 StartTransaction / Commit 等方法。
    【解决方案2】:

    就管理连接而言,不要。 .Net 将为您保留一个池,并有效地回收它们。尝试自己回收它们实际上会损害性能。

    除此之外,听起来您做得对,插入,获取 ID,在该范围内使用相同的连接再次插入。

    【讨论】:

    • 这有点短视。如果您关闭连接池,您可以以更有效和更可靠的方式管理您的连接,它只是在您的代码中(在某种程度上)引入开销来处理它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    相关资源
    最近更新 更多