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にシリアル化する方法です。
例
これにより、SQLServerに挿入しようとしたときにエラーが発生します。
<?xml version="1.0" encoding="utf-16"?>
<MyMessage>Teno</MyMessage>
これはしません:
<?xml version="1.0" encoding="utf-8"?>
<MyMessage>Teno</MyMessage>
アップデート
Xml
SQL Server 2008の列タイプにutf-8が必要な場合、およびencoding
挿入しようとしているxml仕様のプロパティにutf-16がある場合を把握しました。
を追加する場合はutf-8
、次のようにSQLコマンドにパラメーターを追加します。
sqlcmd.Parameters.Add("ParamName", SqlDbType.VarChar).Value = xmlValueToAdd;
前の行にxmlValueToAddを追加しようとするとencoding=utf-16
、挿入時にエラーが発生します。また、VarChar
国の文字が認識されないことを意味します(疑問符として表示されます)。
utf-16をdbに追加するには、または前の例で使用するSqlDbType.NVarChar
かSqlDbType.Xml
、タイプをまったく指定しないでください。
sqlcmd.Parameters.Add(new SqlParameter("ParamName", xmlValueToAdd));