Установка первичного ключа означает, что значения столбцов должны быть уникальными.
Кажется, DataTable не заставляет ключ быть другим , но он сравнивается как ненулевой , используя правила сравнения DataTable.Locale.
DataTable.Locale.CompareInfo.Compare может возвращать 0, даже если строки различаются, так как они сортируют одинаково.
Есть ли способ изменить поведение? Я не мог найти, как заменить CompareInfo.
Пример данных, которые я имею, включает некоторые символы из категории UnicodeCategory.OtherNotAssigned .
using System;
using System.Data;
namespace datatabletest
{
class Program
{
static void Main( string[] args )
{
string key = "key";
string metric = "metric";
string key1 = "\u0a0dtest\u0a0d;";
string key2 = "test\u0a0d;";
DataTable table = new DataTable("table");
table.Columns.Add( key);
table.Columns.Add( metric );
table.PrimaryKey = new[] { table.Columns[key] };
table.BeginLoadData();
{
DataRow row = table.NewRow();
row[key] = key1;
row[metric] = "500";
table.Rows.Add( row );
}
{
DataRow row = table.NewRow();
row[key] = key2;
row[metric] = "500";
table.Rows.Add( row );
}
// strings are different
Console.WriteLine( key1 == key2 );
//but they compare method still returns 0
Console.WriteLine( table.Locale.CompareInfo.Compare( key1, key2 ) );
// throws a ConstraintException
table.EndLoadData();
}
}
}