【发布时间】:2011-04-15 05:13:47
【问题描述】:
我正在尝试插入 XML 列 (SQL SERVER 2008 R2),但服务器抱怨:
System.Data.SqlClient.SqlException (0x80131904):
XML解析:第1行,第39个字符,无法切换编码
我发现 XML 列必须是 UTF-16 才能使插入成功。
我使用的代码是:
XmlSerializer serializer = new XmlSerializer(typeof(MyMessage));
StringWriter str = new StringWriter();
serializer.Serialize(str, message);
string messageToLog = str.ToString();
如何将对象序列化为 UTF-8 字符串?
编辑:好的,很抱歉混淆了 - 字符串需要采用 UTF-8 格式。你是对的 - 默认情况下它是 UTF-16,如果我尝试插入 UTF-8,它就会通过。所以问题是如何序列化成UTF-8。
示例
这会在尝试插入 SQL Server 时导致错误:
<?xml version="1.0" encoding="utf-16"?>
<MyMessage>Teno</MyMessage>
这不是:
<?xml version="1.0" encoding="utf-8"?>
<MyMessage>Teno</MyMessage>
更新
我发现 SQL Server 2008 的 Xml 列类型何时需要 utf-8,以及当您尝试插入的 xml 规范的 encoding 属性中的 utf-16 时:
当你想添加utf-8,然后像这样在SQL命令中添加参数:
sqlcmd.Parameters.Add("ParamName", SqlDbType.VarChar).Value = xmlValueToAdd;
如果您尝试在前一行中添加带有encoding=utf-16 的xmlValueToAdd,则会在插入时产生错误。此外,VarChar 表示无法识别国家字符(它们变成问号)。
要将 utf-16 添加到 db,可以在前面的示例中使用 SqlDbType.NVarChar 或 SqlDbType.Xml,或者根本不指定类型:
sqlcmd.Parameters.Add(new SqlParameter("ParamName", xmlValueToAdd));
【问题讨论】:
-
你能不能不将所有内容都保存为 XML,而是在应用程序中将其转换为字符串,而只是让 SQL Server 尝试将其转换回 XML?
-
我收到了对象 - 我还没有 XML,这就是我需要的
-
@Damien_The_Unbeliever - 是的,你可以!请看我刚刚提供的答案。
标签: .net sql-server xml utf-8 utf-16