2017-06-09 70 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