2009-08-11 3 views
2

Я использую VSTS2008 + C# + .Net 3.0. Вот мой код и связанное с ним исключение из ADO.Net. Вот мой ввод двух строк как в бинарной форме, так и в текстовой форме, любые идеи, что не так? Почему две разные строки будут обрабатываться ADO.Net одинаково?очень странная строка уникальная проблема в C#

Сообщение об исключении:

An unhandled exception of type 'System.Data.ConstraintException' occurred in System.Data.dll 

Additional information: Column 'Name' is constrained to be unique. Value '������' is already present. 

Входные строки в двоичной форме и текстовой форме:

alt text http://i32.tinypic.com/23lidcx.jpg

alt text http://i29.tinypic.com/250p3ib.jpg

StackOverflow не отображается правильно для моего кода для строк , вот скриншот экрана для того, что на самом деле выглядит в моем редакторе VSTS 2008.

alt text http://i28.tinypic.com/2j10ehg.jpg

Мой код:

static void Main(string[] args) 
    { 
     string[] buf = new string[] { "����", "������" }; 

     CompareInfo ci = System.Globalization.CultureInfo.InvariantCulture.CompareInfo; 
     ci.Compare(buf[0], buf[1], CompareOptions.IgnoreWidth); 
     Console.WriteLine (String.Compare(buf[0], buf[1], StringComparison.InvariantCultureIgnoreCase)); 

     DataTable bulkInserTable = new DataTable("BulkRequestTable"); 
     bulkInserTable.CaseSensitive = true; 
     DataColumn column = null; 
     DataRow row = null; 

     // add Keyword column to datatable 
     column = new DataColumn(); 
     column.DataType = System.Type.GetType("System.String"); 
     column.ColumnName = "Name"; 
     column.ReadOnly = true; 
     column.Unique = true; 
     bulkInserTable.Columns.Add(column); 

     foreach (string item in buf) 
     { 
      row = bulkInserTable.NewRow(); 
      row["Name"] = item; 
      bulkInserTable.Rows.Add(row); 
     } 
    } 
+2

Вы пробовали испытывать значение BUF [0] == ЬиЕ [1]? Я не могу сказать, что происходит с « » в строках. – JoshJordan

+1

@JoshJordan, см. Ссылки на изображения –

+0

Спасибо JoshJordan, от String.Compare, результат равен 0, поэтому означает, что они одинаковы. С точки зрения перспективы (перспектива человеческого глаза), они разные. Вот скриншот экрана VSTS 2008, любые идеи, что не так? http://i28.tinypic.com/2j10ehg.jpg – George2

ответ

1

Когда один из строк преобразуется храниться в DataTable это приводит к одной и той же строки, как другой. , так что уникальное ограничение на dataTable заставляет исключить его.

+0

Почему БД думает, что они такие же? Из-за этого они явно различаются. :-) – George2

1

Не знаете, какой шрифт или символ задают эти классные персонажи, но они, похоже, не очень хорошо сортируются. Compare() работает на основе сортировки строк, поэтому культура очень важна для сравнения чувствительных к культуре строк. Эти символьные строки не возвращаются как отличные от перспективы сортировки, поэтому они действуют «одинаково». Метод String.Equals() покажет их как разные.

buf[0].Equals(buf[1]) = false 

Не уверен, почему нужно использовать специальные символы, но если это является обязательным требованием, чтобы иметь как «уникальные» ключи, которые могут быть проблемой. Я предполагаю, что datatable использует аналогичное сравнение для проверки уникальных значений столбца и поэтому видит две строки как дубликаты.

4

Я видел, что вы использовали InvariantCulture для сравнения. Вы должны использовать Ordinal (сравнение буквенного символа) или CurrentCulture (который принимает замены на место, например Æ === AE), чтобы выполнять ваши сравнения.

Вы могли бы получить больше удачи, введя символы как символов Unicode строк, например:

string text = "\uEFBF\uBDEF\uBFBD\uEFBF"; 
string text2= "\uEFBF\uBD0D\uAEFB\uFBDE\uFBFB"; 

У меня это как некоторые китайские/японские символы (не приклеивая полностью):

string text = "뷯뾽"; 
string text2 = "봍껻ﯞﯻ"; 

CurrentCulture будет знать, что один символ может представлять 2 других символа, поэтому это будет хороший выбор для использования. Ординал просто заметит, что длины разные. Если они имеют одинаковую длину, и каждое значение Юникода одинаково для каждого символа, то оно будет успешным.

0

возможно отключить уникальное ограничение соблюдения данныхTable и реализовать свой собственный уникальный метод проверки?

0

Ваша проблема, вероятно, связана с тем, что ваш персонаж является особым символом юникода.

"The replacement character � (often a black diamond with a white question mark) 
is a symbol found in the Unicode standard at codepoint U+FFFD in the Specials 
table. It is used to indicate problems when a system such as a text parser was 
not able to decode a stream of data to a correct symbol" 

http://en.wikipedia.org/wiki/Unicode_Specials

Смежные вопросы