【问题标题】:Database handling in applications应用程序中的数据库处理
【发布时间】:2011-02-02 16:15:21
【问题描述】:

这是一个有点难问的问题,但欢迎任何反馈。

先从背景说起,我是一名大学生,去年学习软件工程,我们介绍了 c#,我在一家软件公司工作,用 c#(他们的主要语言是使用 QT 的 c++)编写原型软件。原型它被提供给了一些客户,这些客户都反馈了积极的反馈。

现在我正在查看该应用程序并认为我可以将其用作我的简历的展示,尤其是因为使用该软件的客户表示他们将签署一些东西以供参考。

因此,如果我要这样做,那么我最好把它做好,并尽我所能做到最好。所以我开始研究它并思考我可以改进它的地方,我认为可以改进的方法之一是它处理数据库连接和数据的方式。

应用程序本身与 MySQL 服务器一起运行,并且有 6 种不同的模式可以从中获取数据。

我写了一个类(称为databaseHandler),其中包含mysqlconnection(一个问题是关于连接是否应该在应用程序运行的整个过程中保持打开状态,或者打开它触发查询然后关闭它等等)在里面这个类我写了一个方法,它接受一些参数并创建它的查询字符串,然后它执行整个 mysqlDataReader = cmd.executeReader(),然后将读取器返回到它被调用的位置。

在与朋友交谈后,他提到如果该方法返回原始数据而不是读取器可能会很好,因此将所有数据库“资料”远离主应用程序。

在玩了之后,我设法找到了一些关于将读取器数据放入数组和数组列表并传递回来的教程,还尝试传递回哈希表的数组列表 - 这些方法 obv 意味着开发人员必须知道列名以便找到正确的数据。

然后我偶然发现了一个页面,该页面继续创建一个具有列名属性的类并创建了一个列表,您可以从中提取数据:

http://zensoftware.org/archives/248是链接

所以这让我想到,为了使用这种方法,我是否需要创建 6 个具有表列属性的类(几个表最多有 10-15 列)?还是有更好的方法来处理我的数据?

我对这些事情并不是很了解,但如果指向正确的方向,我是一个非常快速的学习者:)

再次感谢您的任何意见。

维德

【问题讨论】:

    标签: c# mysql oop


    【解决方案1】:

    您有很多非常接近但很常见的问题的想法,但是您正在积极思考如何处理它们,这很好!

    关于为整个程序保持连接打开或仅在实际查询时间内打开连接的问题。执行此操作的常见(且正确)方法是仅根据需要打开连接,因此

    MySqlConnection cn = new MySqlConnection(yourConnectionString);
    
    //Execute your queries
    
    cn.close();
    

    这样更好,因为您不会冒险留下打开的连接,或者在输入数据库和资源时遇到事务问题。

    只返回数据而不是实际的数据读取器,这是一个好主意,但只是将数据作为 ArrayList 或任何你有点丢失数据结构的东西返回。

    这样做的一个好方法是让你的类只使用数据读取器来填充它的数据,或者让数据层在读取数据后只返回你的类的一个实例。

    【讨论】:

      【解决方案2】:

      我相信,如果您的数据访问类返回一个由数据库中的数据填充的自定义类,那将是一种极好的方法。那将是面向对象的。例如,您将创建一个具有属性的 Customer 类,而不是返回一个 DataSet 或一个包含客户信息的数组。然后,当您从数据库中检索数据时,您使用数据填充 Customer 类的实例,并将其返回给调用代码。

      许多较新的 Microsoft 技术都致力于简化这项任务。很多时候,需要超过 6 个类,编写所有这些代码似乎是件苦差事。我建议,如果您有兴趣了解这些较新的方法,并可能将它们改编为您自己的代码,您可以查看Linq to SQLEntity Framework

      【讨论】:

        【解决方案3】:

        一个问题是关于连接是否应该在整个过程中保持打开状态 应用程序运行的时间,或打开它触发查询然后关闭它等

        您希望尽可能少地保持连接打开。因此,您应该在每个数据请求上打开并在完成后立即关闭它。您也应该处理它,但如果您的数据库内容位于自动发生的 C# using 语句中。

        就如何将数据返回到您的应用程序的更大问题而言,您走在正确的轨道上。您通常希望对应用程序的其余部分隐藏原始数据库,并将原始数据映射到其他中间类是正确的做法。

        现在,如何进行映射是一个非常大的话题。理想情况下,您不想创建将表/列一对一映射的类,而是为您的应用程序提供对应用程序更友好的数据表示形式(例如,业务对象而不是数据库表。)例如,如果您的员工数据是出于规范化目的,拆分为或三个表,您可以隐藏这种复杂性并将信息显示为单个 Employee 类,该类将来自其他表的数据绑定在一起。

        【讨论】:

          【解决方案4】:

          使用对象抽象出您的数据访问代码称为Object/Relational mapping。这实际上是一项比乍看起来要复杂得多的任务。有几个库,甚至在框架本身中,已经很好地完成了您尝试实现的任务。

          如果您的需求非常简单,请查看类型化数据集。它们允许您在设计器中创建表类,并生成将为您执行加载和保存的对象(鉴于某些限制)

          如果您的需求不那么简单,但仍然非常简单,我建议您看看 Linq To SQL 看看它是否满足您的需求,因为它以非常简单的方式进行表类映射并使用更现代的使用模式比 DataSets。

          还有更复杂的 ORM 允许您定义更复杂的映射,例如 Entity Framework 或 nHibernate,但通常不需要它们的复杂性。

          连接寿命等详细信息将取决于您的具体需求。有时最好保持连接打开,如果您有很多由用户交互引起的查询,就像桌面应用程序通常的情况一样。其他时候最好让它们尽可能短以避免拥塞,例如网络应用程序的情况。

          无论您选择哪种技术,最终都可能会引导您找到一套好的做法,而您能做的最好的事情就是尝试一下,看看哪种技术最适合您。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-09-21
            • 1970-01-01
            • 2010-11-27
            • 1970-01-01
            • 2011-06-07
            • 2011-05-31
            • 1970-01-01
            相关资源
            最近更新 更多