2011-10-11 75 views
1

比方说,我有一个函数可以将记录插入数据库表中,字符串字段的长度有限。一般来说,我应该在什么时候截断对于存储位置来说太长的字符串,在插入函数本身中还是在代码中调用它的每个点上?何时截断比存储位置更长的字符串?

(我在这里假设太长比拥有一个异常抛出更理想的字符串是被截断。)

回答

3

我认为这取决于函数的位置以及它的可访问性。

如果它是一个私人的功能,只是让你自己的SQL库,然后你也许可以逃脱在功能截断它。

如果它在这,说,你的团队在工作,那么所有使用也许你需要尝试插入它之前至少解析字符串库。

如果它是一个公共的API,那么你不应该静静地截断任何东西 - 抛出一个有意义的异常来代替。

+0

+1 - 我同意这 – ChrisBD

+0

恐怕简单地抛出一个异常会导致稍后出现问题,因为懒惰的编程......也就是说,我期望使用这个函数的程序员很可能会忘记用长字符串进行测试。 –

+1

@Protectorone在这种情况下,他们会很高兴你抛出异常,当然!如果你没有,他们永远不会知道他们的字符串已被截断! – Widor

1

这应该坐在插入功能 - 它的数据库特定的实现,而不是调用应用。如果你设法改变你的数据结构,你不想回头查看所有的客户端代码,以确保使用完整的字符串。

0

按Widor,但我还要补充:

您的应用程序就理应结构使得有你的代码的其余部分从数据库和它的实现逻辑隔离不同的数据层。

在高流量系统中,您最好希望限制数据库和代码之间来回传递的数据量,因此数据验证应在数据层传递到数据库之前由您的数据层执行。在这里,您可以为您的业务逻辑提出一个有意义的异常来处理。

数据层提供的对象数据不必承担任何关系什么是真正存储或数据库。例如,它可能会提供一个数据对象类,它实际上是存储在多个表中的数据的组合。

数据层本身的结构可以处理不同的数据库实现。

我已经使用已经让我在运行时需要,而无需重新编译SQL,MySQL数据库,XML文件存储和编译测试数据之间切换,在过去的一个工厂模式。

编辑 您的应用程序数据层是您的应用程序代码之间的接口,例如,业务逻辑和GUI以及您的数据库。

业务逻辑将触发数据层以使用字符串更新数据库。

在你的例子中,数据层包含你的更新函数。

您可以验证字符串,如果太长截断它,然后更新数据库(通过存储过程调用或例如直写),该函数内,如果你的愿望。

实际上,您将有许多字符串必须限制在相同的长度,因此建议您使用单独的函数执行验证以保存重复的代码。

另外,您可能希望验证/截断字符串,并在不将数据写入数据库的情况下通知用户/调用代码。

本质上,虽然这是由您的应用程序数据层代码执行的,它可能封装在类库/ dll中,而不是留给数据库来处理,也不是业务逻辑(除了对任何错误事件/反馈反馈)。

+0

假设我在问题中提到的函数是_in_数据层。或者说,你是说截断应该发生在数据层内? –

+0

如果您的插入功能位于数据层,而不是应用程序业务逻辑或数据库存储过程,那么是的。看到我编辑的答案。 – ChrisBD