1

次のコードを検討してください。

[Test]
    public void StackOverflowQuestionTest()
    {
        const string connectionString = "enter your connection string if you wanna test this code";

        byte[] result = null;
        using (var connection = new SqlConnection(connectionString))
        {
            connection.Open();
            using (var sqlCommand = new SqlCommand("declare @xml as xml = '<xml/>' SELECT convert(varbinary(max), @xml) as value"))
            //using (var sqlCommand = new SqlCommand("SELECT convert(varbinary(max), N'<xml/>') as value"))
            {
                sqlCommand.Connection = connection;

                using (SqlDataReader reader = sqlCommand.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        result = (byte[])reader["value"];
                    }

                    reader.Close();
                }
            }
        }

        string decodedString = new UnicodeEncoding(false, true).GetString(result);
        var document = XElement.Parse(decodedString);
    }

このテストを実行すると、「ルート レベルのデータが無効です。行 1、位置 1」というメッセージを含む XmlException が発生します。結局のところ、問題は無効な文字と見なされる「0xFFFE」プリアンブルです。代わりにコメント付きの文字列を使用すると、すべてが正常に機能することに注意してください。これは、私にとっては奇妙です。SqlServer は BOM を使用して UCS-2 に XML 文字列を格納すると同時に、BOM なしで nvarchar 値を格納するようです。主な質問は、このバイト配列をこのプリアンブル (BOM) を含まない文字列にデコードするにはどうすればよいですか?

4

1 に答える 1

0

将来誰かがこれを必要とする場合に備えて、次のコードが機能します。

using(var ms = new MemoryStream(result))
{
    using (var sr = new StreamReader(ms, Encoding.Unicode, true))
    {
        decodedString = sr.ReadToEnd();
    }
}
于 2012-10-23T09:57:21.843 に答える