2010-03-09 31 views
2

这是确保字段具有数据库有效值的好方法吗?我如何验证分类字段?

internal class Customer 
{ 

    private string _CustomerId; 
    internal string CustomerId 
    { 
     get 
     { 
      return (_CustomerId==null?string.Empty:(_CustomerId.Length>20?_CustomerId.Substring(0,20):_CustomerId)); 
     } 
     set 
     { 
      _CustomerId = value; 
     } 
    }} 

问候斯文

+0

你能提供更多关于你正在使用的细节吗?这是什么技术。你使用哪种数据库技术,以及你如何与它进行交互?这是Web/Windows/WPF /类库吗? – 2010-03-09 12:05:27

+0

对不起 它在一个classlibray中。我正在为一个正在同步2个数据库的应用程序构建一个库。我的问题是,他们允许不同长度的表中的字段。 检查null是因为在提供空值​​时向sql查询添加参数时出现错误。 – Zwempha 2010-03-09 12:12:45

回答

3

一个清洁技术是使用验证属性来标注你的属性和使用库来验证实体。

例子包括:

然后,根据所选择的库中,你的代码将类似于:

public class Customer 
{ 
    [StringLengthValidator(20)] 
    public virtual string CustomerId { get; set;} 
} 
+1

当您的验证很简单时,我会使用DataAnnotations。当需求更加复杂时,请使用企业库验证应用程序块。它允许许多复杂的场景。 – Steven 2010-03-09 12:23:00

+0

+1 DataAnnotations可能是Sven需要的唯一东西。与其他人一样,当他释放图书馆时,他不得不担心可能存在冲突的许可证。旁注:另一个答案是张贴,而我输入这个,并以某种方式使我的评论成为一个答案! – 2010-03-09 12:23:32

+0

同意。我最近犯的错误是使用Enterprise Library Validation Block属性装饰WCF DataContracts,现在所有WCF服务的使用者都需要引用各种EntLib dll的特定版本。哎呀。 回想起来,我应该使用DataAnnotations。 – 2010-03-09 12:26:50

2

验证输入的方式非常脆弱。您正在排除任何可能的输入(对于这种情况下的CustomerId)并在请求时对其进行清理。这可能适用于这种基本情况,但在很多情况下,您无法清理输入。你基本上是纠正用户的错误,并假设他想要的。你将如何使用邮件地址做到这一点?例如,必须将邮件地址'stevenhotmail.com'转换为'[email protected]'或'[email protected]'。除此之外,还有编程错误的可能性。你想让你的程序尝试修复你自己的编程错误。这会让你头痛。或者当同一实体的两个属性必须进行比较时,你会做什么?

更好的解决方案是让实体处于无效状态并在将其保存到数据库之前检查其有效性。当状态无效时,不要尝试自动更正这些更改,而只是抛出异常或将错误传回给用户。

有多种方法可以做到这一点。例如,您可以在每个实体上实施IsValid()方法或使用验证框架。