2009-10-14 82 views
1

作为一个集成任务的一部分,我在数据库中有一个列类型为nvarchar(30),我需要调用一个WCF服务并通过这个值列(等等),然后将存储在另一个数据库中具有类型varchar(30)的列中。将数据从nvarchar转换为C#中的varchar

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

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

+0

我假设的Sql Server?使用ADO .NET访问数据库? – Mac 2009-10-14 06:50:09

+0

你有什么具体问题? – Mac 2009-10-14 06:50:47

+0

Mac - 我会用你的解决方案(对我来说最简单:)),如果事情开始破裂,我会报告回来。 – 2009-10-15 01:00:27

回答

8

什么你要做的:在.NET are UTF-16 encoded所有字符串:

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

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

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

+0

UTF-16或UCS-16? – 2009-10-14 06:44:10

+0

根据我刚刚添加的链接,UTF-16。 – Mac 2009-10-14 06:48:59

+0

我认为我应该对字符集之间的转换保持安全,因为绝大多数字符集都是纯英文的,但该网站在国际上可用,所以如果人们开始使用非英语内容会发生什么情况会很有趣。 – 2009-10-15 01:04:46

1

如果目标列表示ASCII字符,以便只需使用Encoding.Convert方法

例如:

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

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

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

+0

鉴于我们的目标受众,绝大多数内容应该与varchar兼容。然而,该网站是国际上可用的,所以我会密切关注正在转换的内容,并在出现/出现时跨越该桥。 – 2009-10-15 01:03:14

+0

当我将公司名称(❤tech)放在您的联系表单上时,该怎么办?我说英语,但我仍然喜欢使用非ansi字符 – 2013-04-11 14:35:06