2009-10-14 12 views
1

Dans le cadre d'une tâche d'intégration que je fais, j'ai une colonne dans ma base de données qui a le type nvarchar (30) et j'ai besoin d'appeler un service WCF et passer les valeurs dans cette colonne (entre autres) qui sera ensuite stockée dans une colonne qui a le type varchar (30) dans l'autre base de données.Conversion de données de nvarchar en varchar en C#

Que dois-je faire (vraisemblablement dans le code qui appelle le service WCF) pour convertir mes chaînes en chaînes "varchar friendly"?

Mise à jour: Rien ne s'est encore mal passé. Cependant, je vais effectuer une migration initiale de 120 000 enregistrements via ce service, puis environ 300 nouveaux enregistrements seront générés par ce service chaque jour. En tant que tel, l'intervention manuelle de toute sorte est très indésirable et je ne fais que penser à ce qui pourrait mal tourner à l'avance. Je n'ai aucun contrôle sur la base de données cible (avec la colonne VARCHAR), mais je sais que c'est SQL Server et C# pour l'application (pas sûr si elles utilisent ADO.NET).

+0

Sql Server Je présume? Accès à la base de données à l'aide d'ADO .NET? – Mac

+0

Quels problèmes spécifiques avez-vous eu? – Mac

+0

Mac - Je vais aller avec votre solution (plus facile pour moi :)) et je ferai rapport si les choses commencent à se casser. –

Répondre

8

Il n'y a rien que vous devez faire: toutes les chaînes dans .NET are UTF-16 encoded:

Lorsque vous récupérez votre colonne NVARCHAR (en utilisant ADO .NET je présume), vous obtenez automatiquement une chaîne .NET (UT)
  • F-16, toute conversion nécessaire est automatique). Lorsque vous stockez cette chaîne .NET dans une colonne VARCHAR, toute conversion nécessaire à partir de UTF-16 est également automatiquement effectuée.

See here Pour plus d'informations sur les mappages de type de données pour SQL Server dans ADO .NET.

Vous devez simplement vous assurer que toutes vos chaînes peuvent être converties sans problème du jeu de caractères source vers le jeu de caractères de destination.

+0

UTF-16 ou UCS-16? –

+0

UTF-16, selon le lien que je viens d'ajouter. – Mac

+0

Je pense que je devrais être sûr sur la conversion entre les jeux de caractères car la grande majorité sera un anglais simple, mais le site est disponible internationalement, donc il serait intéressant de voir ce qui se passerait si les gens commençaient à mettre du contenu non-anglais. –

1

Si la colonne de destination représente les caractères ascii donc utilisez simplement la méthode Encoding.Convert

exemple:

Encoding.ASCII.GetString(Encoding.Convert(Encoding.Unicode, Encoding.ASCII, bytes)) 
1

Votre problème n'est pas les types de données, ce sont les données. Toutes les valeurs possibles qui peuvent être stockées en tant que nvarchar n'ont pas d'équivalent dans varchar (selon le classement). Si la deuxième base de données est sous votre contrôle, le moyen le plus simple de transmettre les données est de changer le champ varchar en nvarchar maintenant.

Si vous ne pouvez pas faire cela, vous devez vérifier les données avant de l'envoyer pour vous assurer que les données peuvent être converties. Selon les types de problèmes de données que vous avez, vous pouvez supprimer les caractères qui ne seront pas convertis ou remplacés par un autre caractère ou mettre l'enregistrement dans un certain type de table plutôt que de l'envoyer pour qu'il soit corrigé manuellement. La suggestion d'Ahmed ressemble à une possibilité, je ne l'ai pas essayée donc je ne sais pas si ça va marcher. Vous pouvez être chanceux et ne pas avoir de problèmes de données (toutes les bases de données qui utilisent nvarchar n'utilisent pas les caractères que varchar n'aura pas avec le bon classement de pays), mais vous devez planifier le problème.

+0

Compte tenu de notre public cible, la grande majorité du contenu devrait être compatible avec varchar. Cependant, le site Web est disponible à l'échelle internationale, donc je garderai un œil sur le contenu qui est en train de se transformer et de traverser ce pont si/quand il arrive. –

+0

Que se passe-t-il lorsque je mets mon nom de société (❤tech) dans votre formulaire de contact? Je parle anglais, mais j'aime toujours utiliser des caractères non-ansi –

Questions connexes