我正在尝试插入 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,以及当encoding
您尝试插入的 xml 规范的属性中的 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));