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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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