Я хочу вставить произвольный XML в SQL Server. XML содержится в объекте XmlDocument.
Столбец, в который я хочу вставить, - это либо столбец nvarchar, ntext, либо xml (Если это облегчает вашу жизнь, вы можете выбрать, какой это тип. Действительно, это столбец xml.)
Прототип
void SaveXmlToDatabase(DbConnection connection,
XmlDocument xmlToSave,
String tableName, String columnName);
{
}
Причина, по которой я спрашиваю, состоит в том, что я пытаюсь найти правильный способ превратить XmlDocument во что-то, что может принять база данных - обязательно сохраняя правильное кодирование:
- Я должен убедиться, что кодировка, используемая во время вставки, совпадает с той, что использует база данных
- Я должен синхронизировать элемент
<?xml version="1.0" encoding="windows-1252"?>
Я знаю, что ntext, nvarchar или xml хранятся как UTF-16 внутри SQL Server. Поэтому я должен быть уверен, что данные SQL Server будут передаваться как UTF-16. Это не проблема для String в .NET, поскольку они являются юникодом UTF-16.
Вторая проблема - синхронизация атрибута кодирования - это более сложный способ взломать. Я должен выяснить, как найти элемент объявления через объект XmlDocument:
<?xml version="1.0" encoding="windows-1252"?> (or whatever the encoding may be)
и настройте его на UTF-16
<?xml version="1.0" encoding="UTF-16"?>
Моя наивная попытка (которая не удалась)
Игнорирование кодировки в декларации XML и просто выяснение, как сохранить что-либо в SQL Server:
void SaveXmlToDatabase(DbConnection connection,
XmlDocument xmlToSave,
String tableName, String columnName);
{
String sql = "INSERT INTO "+tableName+" ("+columnName+")
VALUES ('"+xmlToSave.ToString()+"')";
using (DbCommand command = connection.CreateCommand())
{
command.CommandText = sql;
DbTransaction trans = connection.BeginTransaction();
try
{
command.ExecuteNonQuery();
trans.Commit();
}
catch (Exception)
{
trans.Rollback();
throw;
}
}
}
Это не получается, потому что sql, который я пытаюсь запустить, это:
INSERT INTO LiveData (RawXML)
VALUES ('System.Xml.XmlDocument')
Это потому, что XmlDocument.ToString() возвращает "System.Xml.XmlDocument". Взглянув на реализацию, он видит, что буквально вызывает:
this.GetType().ToString();
Помимо: Microsoft, похоже, старается изо всех сил, чтобы помешать вам от получения XML в виде строки - предположительно потому что это приводит к ошибкам (Но они не говорят нам, какие ошибки, почему это ошибки, или правильный путь преобразовать
XmlDocumentвString!)