Преобразование данных из nvarchar в varchar в C#

В рамках задачи интеграции, которую я выполняю, у меня есть столбец в моей базе данных, который имеет тип nvarchar (30), и мне нужно вызвать службу WCF и передать значения в этом столбце (среди прочего), которые затем будут сохранены в столбец с типом varchar(30) в другой базе данных.

Что мне делать (предположительно, в коде, который вызывает службу WCF), чтобы преобразовать мои строки в «дружественные к varchar» строки?

Обновление: пока ничего не пошло не так. Однако я буду выполнять первоначальную миграцию 120 000 записей через эту службу, а затем каждый день через эту службу будет передаваться около 300 новых записей. Таким образом, ручное вмешательство любого рода очень нежелательно, и я просто заранее думаю о том, что может пойти не так. У меня нет контроля над целевой базой данных (со столбцом VARCHAR), однако я знаю, что это SQL Server и C # для приложения (не уверен, что они используют ADO.NET).


person Brian Hinchey    schedule 14.10.2009    source источник
comment
Sql-сервер, я полагаю? Доступ к базе данных с использованием ADO .NET?   -  person Mac    schedule 14.10.2009
comment
Какие конкретно проблемы у вас были?   -  person Mac    schedule 14.10.2009
comment
Mac - я воспользуюсь вашим решением (самым простым для меня :)) и сообщу, если что-то начнет ломаться.   -  person Brian Hinchey    schedule 15.10.2009


Ответы (3)


Вам не нужно ничего делать: все строки в .NET в кодировке UTF-16 :

  • когда вы извлекаете свой столбец NVARCHAR (я полагаю, используя ADO .NET), вы автоматически получаете строку .NET (UTF-16, любое необходимое преобразование выполняется автоматически).
  • когда вы сохраняете эту строку .NET в столбце VARCHAR, любое необходимое преобразование из UTF-16 также выполняется автоматически.

Дополнительную информацию о сопоставлении типов данных для Sql Server в ADO см. здесь. .СЕТЬ.

Вам просто нужно убедиться, что все ваши строки могут быть безупречно преобразованы из исходного набора символов в целевой набор символов.

person Mac    schedule 14.10.2009
comment
UTF-16, по ссылке, которую я только что добавил. - person Mac; 14.10.2009
comment
Я думаю, что я должен быть в безопасности при преобразовании между наборами символов, поскольку подавляющее большинство будет просто английским, но веб-сайт доступен по всему миру, поэтому было бы интересно посмотреть, что произойдет, если люди начнут размещать неанглийский контент. - person Brian Hinchey; 15.10.2009

Если столбец назначения представляет символы ascii, просто используйте метод Encoding.Convert

пример:

Encoding.ASCII.GetString(Encoding.Convert(Encoding.Unicode, Encoding.ASCII, bytes))
person Ahmed Said    schedule 14.10.2009

Ваша проблема не в типах данных, а в данных. Все возможные значения, которые могут быть сохранены как nvarchar, не имеют эквивалента в varchar (в зависимости от сортировки). Если вторая база данных находится под вашим контролем, самый простой способ передать данные — изменить поле varchar на nvarchar сейчас.

Если вы не можете этого сделать, вам нужно проверить данные перед отправкой, чтобы убедиться, что это данные, которые можно преобразовать. В зависимости от того, какие у вас проблемы с данными, вы можете удалить символы, которые не будут преобразованы, или заменить их другими символами, или поместить запись в таблицу хранения какого-либо типа, а не отправлять ее для исправления вручную. Предложение Ахмеда выглядит как возможность, я не пробовал, поэтому не знаю, сработает ли оно. Возможно, вам повезет, и у вас не возникнет проблем с данными (не каждая база данных, использующая nvarchar, использует какие-либо символы, которых не будет у varchar с правильным сопоставлением страны), но вы должны планировать проблему.

person HLGEM    schedule 14.10.2009
comment
Учитывая нашу целевую аудиторию, подавляющее большинство контента должно быть совместимо с varchar. Однако веб-сайт доступен на международном уровне, поэтому я буду следить за контентом, который плохо конвертируется, и перейду этот мост, если / когда он появится. - person Brian Hinchey; 15.10.2009
comment
А если я укажу название своей компании (❤tech) в вашей контактной форме? Я говорю по-английски, но мне все еще нравится использовать символы, отличные от ANSI. - person kͩeͣmͮpͥ ͩ; 11.04.2013