3

我们对数据库的每个查询都使用存储过程。这似乎令人难以置信的未干燥

  1. 设计桌子
  2. 为该表设计 CRUD 操作 SP
  3. 设计代码(最好是一个类)来填充参数并执行 CRUD SP

如果我们添加单个列或更改数据类型,我们必须在 .NET 的一个类中编辑表、少量 SP 和少量函数。

有哪些减少这种重复的技巧?

更新:

结合 Vinko 的想法,我发现了这个。这是我为需要它的人提出的一些代码(在 C# 中):

SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MySQLConnString"].ConnectionString);
SqlCommand comm = new SqlCommand("NameOfStoredProcedure", conn);
comm.CommandType = CommandType.StoredProcedure;

conn.Open();
SqlCommandBuilder.DeriveParameters(comm);
conn.Close();

foreach (SqlParameter param in comm.Parameters)
{ /* do stuff */ }
4

8 回答 8

2

我建议使用代码生成工具,例如 NetTiers 来生成您的 CRUD 层。

于 2008-11-08T05:50:49.390 回答
2

避免修改至少 SP 的一个技巧是编写它们以使用“自省”,即从内部表或 information_schema 视图中推断列名和数据类型。

它的代码编写起来更复杂,但它可以避免每次表更改时都必须修改它,并且可以在其余的 SP 中重用。

创建一个将为您描述表的 SP,例如使用您将从其余 SP 调用的临时表(colname varchar,type varchar)。

顺便说一句,如果您的查询很复杂,这可能会变得非常复杂甚至不可行,但另一方面,如果不是,它可以为您节省很多麻烦。

于 2008-11-08T06:03:13.577 回答
1

OOP 设计原则适用于过程代码,而不是声明性代码。特别是,重用 SP 是非常成问题的。

基于 CRUD 生成器的 UI 设计很有名。另一种将用户明确转变为数据录入员的方法。如果您使用这些,请确保您在它们产生的内容和用户必须处理的内容之间有一个很好的抽象层。

如果我们添加单个列或更改数据类型,我们必须在 .NET 的一个类中编辑表、少量 SP 和少量函数。

听起来您的数据库设计确实决定了您的 OOP 要求。而是从另一个方向开始。

于 2008-11-08T05:53:13.613 回答
1

一旦 SQL 超出单个表,所有这些元查询方法都会死掉。或者想要一个计算列。或者 ...

于 2008-11-08T06:05:44.463 回答
1

就个人而言,我不太喜欢将查询代码放入存储过程中。除了高度复杂的事情外,这似乎是多余的矫枉过正。

以下是我处理数据库和 crud 对象设计的方式:

  1. 我创建数据模型
  2. 我为每个表创建一个视图
  3. 我为每个表创建插入、更新和删除过程。
  4. 我所有的 C# 代码都指向视图和过程。

这使我能够:

  1. 拥有高度灵活的查询目标(视图)
  2. 以我需要的任何方式查询视图,无需冗余。
  3. 通过数据库安全性防止直接访问表
  4. 抽象数据模型,以防我需要在不破坏代码的情况下重构底层数据模型(我知道,这可能会产生性能成本)

拥有一个代表目标表的视图可能会处理许多查询,即使没有,最糟糕的情况是您需要专门为查询创建一个视图,这相当于为它创建一个 proc,所以没有缺点。

我听说有人建议使用存储过程来防止 SQL 注入攻击,但是如果您在查询视图时使用参数化查询,这无论如何都不是问题。...而且我们总是以任何方式使用参数化查询...对吗?;-)

于 2008-11-09T22:49:02.487 回答
1

您使用的“DeriveParameters”方法确实有效,但每个请求涉及 2 次数据库旅行。这种方法会对性能产生影响。Microsoft 的数据访问应用程序块 SqlHelper 类将通过执行完全相同的“自省”来缓解这种情况,但可以选择缓存参数以供重用。这将让您创建单行 SP 调用,而无需重复“goo”设置参数等。

http://msdn.microsoft.com/en-us/library/cc309504.aspx

于 2009-03-05T15:50:52.177 回答
0

我不认为这真的属于 DRY 指南。这只是关于持久性,如果您手动执行#3,那么您应该考虑采用使这更容易的工具集之一。LINQ to SQL 是我个人最喜欢的,但也有很多。

您的#2 也可以轻松实现自动化。减少1)设计数据模型(在概念上)2)在持久层实现它(创建表或添加列)3)在应用程序级别使用它所需的整体工作。

于 2008-11-08T10:16:46.407 回答
0

有些表没有 CRUD,不应该从您的应用程序访问,并且是数据库实现模型的工件。特别是,您的应用程序不应访问多对多链接表,它们应由数据库通过存储过程进行管理。

于 2008-11-09T22:53:15.177 回答