Я хочу вставить произвольный 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
!)