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.
- Perform a raw string insert, which is unlikely to work
- Use an XmlReader and SqlDbType.Xml
- 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(); | |
} | |
} | |
} | |
} |
I'm Chris Small, a software engineer working in London. This is my tech blog. Find out more about me via Github, Stackoverflow, Resume