Chris's coding blog

Avoiding Unicode issues when inserting XML into a SQL Database

December 29, 2010

If you have to insert XML into a SQL Server (2005+) XML column, there’s three ways of doing it.

  1. Perform a raw string insert, which is unlikely to work
  2. Use an XmlReader and SqlDbType.Xml
  3. Use SqlDbType.Text and a Stream.

Below is my preferred way of doing it and gets around the problem you might come up with:

XML parsing: line 1, character (xx),
unable to switch the encoding

This occurs when you’re trying to shove a UTF8 string into the database XML column, using

<?xml version="1.0" encoding="utf-8"?>

It might also happen with a file with no BOM, which can be fixed by opening + saving the file in notepad. Anyway the solution below gets around this issue.

using System.IO;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
...
using (SqlConnection connection = new SqlConnection("conn string"))
{
connection.Open();
string sql = "INSERT INTO mytable (xmlColumn) VALUES (@xmlData)";
using (SqlCommand command = new SqlCommand(sql, connection))
{
// Swap round if the source file is unicode
string xml = File.ReadAllText(@"C:\myxml.xml");
//string xml = File.ReadAllText(@"C:\myxml.xml", Encoding.Unicode);
using (MemoryStream stream = new MemoryStream())
{
using (StreamWriter writer = new StreamWriter(stream, Encoding.Unicode))
{
writer.Write(xml);
writer.Flush();
stream.Position = 0;
SqlParameter parameter = new SqlParameter("@xmlData", SqlDbType.Text);
parameter.Value = new SqlXml(stream);
command.Parameters.Add(parameter);
command.ExecuteNonQuery();
}
}
}
}
view raw gistfile1.cs hosted with ❤ by GitHub

sql-serverxml

Chris Small

I'm Chris Small, a software engineer living and working in London. This is my tech blog. Find out more via GithubStackoverflowResume