【发布时间】:2010-02-02 15:40:33
【问题描述】:
我被分配了测试我们的数据库的任务。它是一个测试数据库,我们可以对它做任何我们想做的事情并轻松地回滚它。我被赋予了这项任务,因为我们仍处于设计阶段(这意味着在项目的任何时间点都可能发生任何更改......将 Person.FirstName 列重命名为 [First_Name],然后将其重命名为 [名字]。我的目标是粗略估计我们在进行更改时会遇到什么样的痛苦,以便我们可以提前计划。我们也可以在生产过程中预期这些类型的更改。
我的清单上的项目是并且已经针对以下项目进行了书面测试:
发送单词 null(不是字面的 null,而是“null”),因为使用动态 SQL 可能会认为您真的是指 null。我们发现这一点是因为姓“null”的人导致抛出异常。
使用单引号是因为动态 SQL 不可能使用单引号。再一次,有人以他们的名义造成了崩溃。
以前从未这样做过,这就是我所知道的可能崩溃的全部内容。还有其他想法吗?我们正在尝试模拟用户可能输入的数据。
编辑 1:我们的问题是我们有一个搜索屏幕,其中包含大约 25 个可以搜索的字段。其中一些搜索字段很简单(例如名字),一些不太简单(类别 1 的日期小于 2,但也有类别 2 的日期大于 2 或在任何时间段都有类别 4)。搜索屏幕允许用户使用这 25 个字段中的每一个字段选择不同的操作符和谓词。有没有比动态 SQL 更好的方法来处理这个问题?我处于一个位置和时间点,如果它更好,我们可以改变一些不同的东西。
编辑 2:我不知道是否值得一提,但我们使用 LINQ 来访问存储过程。我的研究表明,动态 LINQ 不会像动态 SQL 查询那样做我们需要它做的事情。不过可能是错的。
【问题讨论】:
-
哎呀。为什么不使用参数化查询?名字中带有撇号的人并没有导致崩溃(我的姓氏中有撇号),错误的编程导致了崩溃。
-
如果您使用的是动态 SQl,那么您的数据库设计在我的书中已经失败了。不使用动态 SQL 的一个原因是几乎不可能测试它在生产中可能出现问题的所有方式。
-
我们的问题是我们有一个搜索屏幕,其中有大约 25 个字段可供他们搜索。其中一些搜索字段很简单(例如名字),一些不太简单(类别 1 的日期小于 2,但也有类别 2 的日期大于 2 或在任何时间段都有类别 4)。搜索屏幕允许用户使用这 25 个字段中的每一个字段选择不同的操作符和谓词。你会如何建议处理这样的事情?我知道的唯一方法是动态 SQL,但我可以提出更好的方法。
-
LINQ to SQL 之类的东西在这种情况下运行良好。另一种选择是使用查询对象-martinfowler.com/eaaCatalog/queryObject.html