2009-08-11 7 views
2

J'utilise VSTS2008 + C# + .Net 3.0. Voici mon code et l'exception connexe de ADO.Net. Voici mon entrée deux chaînes sous forme binaire et sous forme de texte, des idées ce qui ne va pas? Pourquoi les deux différentes chaînes seront traitées de la même manière par ADO.Net?très étrange chaîne unique en C#

Message d'exception:

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. 

chaînes d'entrée sous forme binaire et sous forme de texte:

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

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

StackOverflow n'affiche pas correctement mon code pour les chaînes , voici un aperçu de l'écran pour savoir à quoi il ressemble réellement dans mon éditeur VSTS 2008.

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

Mon code:

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

Avez-vous essayé de tester la valeur de buf [0] == buf [1]? Je ne peux pas vraiment dire ce qui se passe là-bas avec " " dans les cordes. – JoshJordan

+1

@JoshJordan, voir liens image –

+0

Merci JoshJordan, de String.Compare, la sortie est 0, donc cela signifie qu'ils sont identiques. Du point de vue de l'affichage (perspective œil humain), ils sont différents. Voici un aperçu de l'écran de VSTS 2008, des idées sur ce qui ne va pas? http://i28.tinypic.com/2j10ehg.jpg – George2

Répondre

1

Lorsque 1 des chaînes est convertie à stocker dans datatable il se traduit par la même chaîne que l'autre. donc la contrainte unique sur le dataTable le fait jeter une exception.

+0

Pourquoi DB pense qu'ils sont de la même chose? De disply, ils sont différents évidemment. :-) – George2

1

Vous ne savez pas à quelle police ou à quel jeu de caractères ces personnages sont intéressants, mais ils ne semblent pas très bien triés. Compare() fonctionne sur la base de la triabilité des chaînes, ce qui explique pourquoi la culture est très importante pour comparer les chaînes sensibles à la culture. Ces chaînes de caractères ne reviennent pas aussi différentes d'une perspective de tri, elles sont donc "identiques". La méthode String.Equals() les montrera comme différentes.

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

Je ne sais pas pourquoi la nécessité d'utiliser les caractères spéciaux, mais si cela est une exigence d'avoir comme des clés « uniques » qui peuvent être un problème. Je suppose que le datatable utilise une comparaison similaire pour valider des valeurs de colonnes uniques et voit donc les deux lignes comme dupliquées.

4

Je vous ai vu utiliser InvariantCulture dans votre comparaison. Vous devriez utiliser Ordinal (comparaison littérale caractère par caractère) ou CurrentCulture (qui prend des substitutions en place - comme Æ === AE) pour faire vos comparaisons.

Vous pouvez obtenir plus de chance en entrant les caractères sous forme de chaînes de caractères Unicode comme:

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

J'ai ce que certains caractères chinois/japonais (en collant complètement):

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

CurrentCulture saura qu'un seul symbole peut représenter 2 autres symboles, ce serait donc un bon choix à utiliser. Ordinal remarquera que les longueurs sont différentes. Si elles ont la même longueur et que chaque valeur Unicode est identique pour chaque caractère, elle réussira.

0

peut-être désactiver la contrainte d'application unique dataTable et implémenter votre propre méthode de vérification unique?

0

Votre problème est probablement lié au fait que votre personnage est un caractère Unicode spécial.

"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