我曾经使用SqlCommand和Methodes ExecuteReader以及ExecuteNonReader完成所有数据库逻辑,并且从未使用像DataSet或Datatable这样的东西。
Dim dbcon As Data.Common.DbConnection
Dim cmdselect = dbcon.CreateCommand()
cmdselect.CommandText = "SELECT * FROM users WHERE id = 1"
cmdselect.ExecuteReader()
Dim cmdupdate = dbcon.CreateCommand()
cmdselect.CommandText = "UPDATE FROM useres WHERE id = 1 SET name = 'newname'"
cmdselect.ExecuteNonQuery()
这有时难以管理。所以我想用更有效率的方式。可能以为查询DataTable,对其进行更改然后调用.AcceptChanges以及写回数据库的所有更改。但这似乎不是它的工作方式? 方法.Update要求我自带更新命令,如果我必须自己做,为什么要使用数据表,数据集......无论如何?
你如何编写数据库后端?
我真的不知道要走哪条路......
答案 0 :(得分:0)
首先阅读一些描述数据库/实体提供商文档的文章。 您必须知道一个好的数据库提供程序使用Datatables + Linq进行数据库“操作”,使用另一个抽象层进行实体操作(通过自定义运算符进行双向Datatable< - > Entities转换)。
答案 1 :(得分:0)
最佳解决方案将在很大程度上取决于数据的来源以及现在和未来的需求。
如果正在使用或将要使用Web服务或WCF服务,那么DataTable / DataSet不是一个合适的解决方案,因为这些实体在这些情况下不能序列化或不能很好地序列化。
我个人的偏好,即使预先做的更多,也是为所有数据实体(有时称为数据传输对象或DTO)创建类,并创建与这些实体一起使用的数据库代码。
我知道有可用的对象/关系映射(ORM)组件可以减轻您的负担,但我们发现编写自己的数据库映射代码同样容易,我们可以轻松地将对象移入和移出使用反射的数据库。
以下是我推荐的两个主要做法,因为它们允许我们将应用程序扩展到成千上万的用户,并使用完全相同的数据库后端支持多个客户端(ipad,android,winforms,silverlight,Web客户端)和的DTO:
尽可能将数据库交互嵌入存储过程中。这使得修复和更改行为比尝试跟踪分散在整个代码中的SQL更容易。它还减少了SQL注入攻击的可能性并提高了数据库性能。
创建直接映射到数据库表的类。您可以使用自动化工具(如CodeSmith Generator)从数据库表中创建类和CRUD存储过程。这种做法允许您使用反射执行从数据库表到DTO以及从DTO到存储过程参数的自动映射。
答案 2 :(得分:0)
Serpen,
我曾经按照你描述的方式编写整个应用程序。我知道它有时会很痛苦,例如在数百个表中使用数百个查询时。
我的建议是切换到 ADO.NET实体框架/ Linq 。它具有非常低的学习曲线,它不应该花费你超过一天的时间来进行最多的CRUD操作。
我发现自己节省了80%的时间,不再需要编写所有这些查询。
另外,您可以使用Telerik OpenAccess ORM免费版来试用它。 如果你在几个小时内开始,他们有一个非常好的快速启动女巫。