在C#中将数据从nvarchar转换为varchar

时间:2009-10-14 06:26:52

标签: c# database encoding character-encoding

作为我正在进行的集成任务的一部分,我的数据库中有一个类型为nvarchar(30)的列,我需要调用WCF服务并传递此列中的值(以及其他)存储在另一个数据库中具有varchar(30)类型的列中。

我应该怎么做(可能是在调用WCF服务的代码中)将我的字符串转换为“varchar friendly”字符串?

更新:什么都没有出错。但是,我将通过此服务初步迁移120,000条记录,然后每天将推送约300条新记录。因此,任何形式的人工干预都是非常不受欢迎的,我只是在考虑提前可能出现的问题。我无法控制目标数据库(使用VARCHAR列),但是我知道它是应用程序的SQL Server和C#(不确定它们是否使用ADO.NET)。

3 个答案:

答案 0 :(得分:8)

您必须执行 nothing :.NET are UTF-16 encoded中的所有字符串:

  • 当您检索NVARCHAR列(使用我假设的ADO .NET)时,您会自动获得一个.NET字符串(UTF-16,任何必要的转换都是自动的)。
  • 将此.NET字符串存储在VARCHAR列中时,也会自动执行UTF-16所需的任何转换。

See here,了解有关ADO .NET中Sql Server的数据类型映射的更多信息。

您只需要确保所有字符串都可以从源字符集完美地转换为目标字符集。

答案 1 :(得分:1)

如果目标列表示ascii字符,那么只需使用Encoding.Convert方法

示例:

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

答案 2 :(得分:1)

您的问题不是数据类型,而是数据。可以存储为nvarchar的所有可能值在varchar中都没有等效值(取决于排序规则)。如果第二个数据库在您的控制之下,那么传递数据最无故障的方法是将varchar字段现在更改为nvarchar。

如果您不能这样做,那么您需要在发送数据之前检查数据,以确保它是可以转换的数据。根据您遇到的数据问题的种类,您可能希望删除不会转换的字符或用其他字符替换它们,或者将记录放入某种类型的保留表而不是发送它以使其得到manaully修复。艾哈迈德的建议看起来像是一种可能性,我没有尝试过,所以我不知道它是否会起作用。您可能很幸运,没有任何数据问题(并非每个使用nvarchar的数据库都使用varchar并且具有正确的国家/地区排序规则的任何字符都没有),但您必须计划此问题。