2017-06-09 47 views
2

我有一个DataTable与3x字符串列,一个约束,我试图用唯一的行填充它。第一行很好地添加,但不幸的是,当我尝试添加第二个具有唯一值的值时,我收到一个错误的约束错误消息。ForeignKeyConstraint:与空字符串和空白错误匹配

我已经将我的自定义类级别提升到了最小值,并在尝试添加它们之前为这两个值添加了额外的检查,但结果是矛盾的。

这里有云:

using System.Data; 
using System.Collections; 

namespace DataTableForeignKey 
{ 
    public class Symbols : IEnumerable 
    { 
     protected DataTable fTable = new DataTable(); 
     protected DataColumn fCategoryColumn = new DataColumn("Category", typeof(string)); 
     protected DataColumn fNameColumn = new DataColumn("Name", typeof(string)); 
     protected DataColumn fValueColumn = new DataColumn("Value", typeof(string)); 

     public Symbols() 
     { 
      fTable.Columns.Add(fCategoryColumn); 
      fTable.Columns.Add(fNameColumn); 
      fTable.Columns.Add(fValueColumn); 

      // Temporarily disabled 
      //fTable.Constraints.Add(new ForeignKeyConstraint(fNameColumn, fCategoryColumn)); 

      fTable.Constraints.Add(new ForeignKeyConstraint(fValueColumn, fCategoryColumn)); 
     } 

     public virtual void Add(string aCategory, string aName, string aValue) 
     { 
      var lRow = fTable.NewRow(); 

      lRow[fCategoryColumn] = aCategory; 
      lRow[fNameColumn] = aName; 
      lRow[fValueColumn] = aValue; 
      fTable.Rows.Add(lRow); 
     } 

     IEnumerator IEnumerable.GetEnumerator() 
     { 
      return fTable.Rows.GetEnumerator(); 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var lSymbols = new Symbols(); 
      var lWhitespace = " "; 
      var lEmptyString = string.Empty; 

      if (lWhitespace != lEmptyString) 
      { 
       lSymbols.Add("Whitespace", "Separator", lWhitespace); 
       lSymbols.Add("Prefix", "Command", lEmptyString); 
       // The second Add() throws the following exception: 
       // System.Data.ConstraintException: 'Column 'Value' is 
       // constrained to be unique. Value '' is already present.' 
      } 
     } 
    } 
} 

如何空字符串匹配一个空白?

非常感谢您提前给出答案。

+1

这是正常行为,ms sql server遵循ANSI 92规范https://support.microsoft.com/zh-cn/help/316626/inf-how- SQL服务器,比较弦,与尾随-空间。最有意思的是 - 你不能通过任何SET语句覆盖这样的行为 – vitalygolub

+1

为什么要用来自同一个表的列添加外键约束?我有点惊讶,它可以让你做到这一点。 – Crowcoder

+0

感谢vitalygolub。显然我必须重新设计我的代码。 :( – Tony

回答

1

你在找什么是UniqueConstraint。因此,您可以将该行代码更改为:

fTable.Constraints.Add(new UniqueConstraint(new DataColumn[] { fValueColumn, fCategoryColumn})); 
+0

再次感谢Crowcoder ,它就像一个魅力。:) – Tony