2015-06-20 3 views
-1

я работаю над приложением CLR SQL, после интеграции с SQL, я получаю эту ошибку (на английском языке он работает, но проблемы при добавлении юникодов к dictionory):Элемента с тем же ключом уже был добавлен в словаре

**Msg 6522, Level 16, State 2, Line 1 
A .NET Framework error occurred during execution of user-defined routine or  aggregate "SqlCompare": 
System.ArgumentException: An item with the same key has already been added. 
System.ArgumentException: 
    at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) 
    at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value,  Boolean add) 
    at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value) 
    at Translate_Class_NUM..ctor() 
    at StringPercentageCompare..ctor() 
    at UserDefinedFunctions.SqlComparison()** 

here is my code in c# 
private Dictionary<string, string> MyDictionary; 
//private string[,] MyArray; 

public Translate_Class_NUM() 
{ 
    MyDictionary.Add("?", "01"); 
    MyDictionary.Add("?", "02"); 
    MyDictionary.Add("?", "03"); 
    MyDictionary.Add("?", "04"); 
    MyDictionary.Add("?", "05") 
} 

и SQL кода сервера является CREATE ASSEMBLY DBDB_DeDuplication АВТОРИЗАЦИЯ DBO из 'E: \ Проекты \ DBDB_DeDuplication \ DBDB_DeDuplication \ OBJ \ Debug \ DBDB_DeDuplication.dll' с PERMISSION_SET = SAFE GO

CREATE FUNCTION SqlCompare() RETURNS nvarchar (50) AS EXTERNAL NAME DBDB_DeDuplication.UserDefinedFunctions.SqlComparison; GO

SELECT dbo.SqlCompare(); GO

заранее спасибо

+0

Вы не можете добавить несколько значений к одному и тому же ключу. 'MyDictionary.Add ("? "," 01 ");' помещает строку значений '' 01 '' под ключ ''? "', И следующая строка не будет работать, потому что она использует тот же ключ ''? "'. Вместо этого вы можете использовать синтаксис 'MyDictionary ["?] = "01" ', и это не будет ошибкой, но вы бы перезаписали ваши предыдущие значения под этим ключом. Что-то не так с вашим использованием словаря - вы переключили свои значения и ключи? –

+0

S понял ...? в смысле другой символ в unicode .. вот его отображение как? только .. но в коде я использую разные символы unicode – Santhosh

+0

S. он работает для словаря .add ("a", "01") dictionary.add ("b", "02"), но не работает для unicode Chars like ... dictionary.add ("ಅ", "01") dictionary.add ("ಇ", "02") – Santhosh

ответ

2

Этот код прекрасно работает для меня:

Dictionary<string, string> dict = new Dictionary<string, string>(); 
dict.Add("ಅ","01"); 
dict.Add("ಇ","02"); 

Как я пытался объяснить, прежде чем в комментариях, ваша строка Unicode не должна проходить через компилятору в как вы ожидаете. Иногда это может быть связано с тем, что исходный файл C# сохраняется с кодировкой ASCII или другой кодировкой, поддерживающей не-Unicode. Чтобы гарантировать результаты, используйте буквенное кодирование C# Unicode (U + 0000 - U + FFFF).

Если вы не знаете, как получить эквивалентную последовательность бежать Unicode, вы можете использовать этот код:

static string EncodeNonAsciiCharacters(string value) 
{ 
    StringBuilder sb = new StringBuilder(); 
    foreach(char c in value) { 
     if(c > 127) { 
      // This character is too big for ASCII 
      string encodedValue = "\\u" + ((int) c).ToString("x4"); 
      sb.Append(encodedValue); 
     } 
     else { 
      sb.Append(c); 
     } 
    } 
    return sb.ToString(); 
} 

Console.WriteLine(EncodeNonAsciiCharacters("ಅ")); 
\u0c85 
Console.WriteLine(EncodeNonAsciiCharacters("ಇ")); 
\u0c87 

Итак, то вы можете написать безопасную версию исходного кода, как:

Dictionary<string, string> dict = new Dictionary<string, string>(); 
dict.Add("\u0c85","01"); 
dict.Add("\u0c87","02");